Lubridate: 紀元前の日付

作成日 2009年05月27日  ·  7コメント  ·  ソース: tidyverse/lubridate

自分自身を忘れないでください:紀元前の日付と時刻を考慮してください(キリストの前/西暦の前)

  • ガレット

全てのコメント7件

こんにちは。 私はこれが古代であることを知っていますが、このbce / bcの問題について考えている人はいますか、それともlubridateはこれをネイティブに処理しますか?

より具体的に問題は何ですか。 人々が念頭に置いているユーザーパターンは何ですか?

これを閉じます。 誰かがこれを行うべきであり、有用であると主張する場合は、再開してください。

ええと、私はこれを定期的に使用しているわけではありませんが、負の年、つまりBCが含まれていて、それを処理するのにかなりの困難があったデータセットで作業しました。 たとえば、次は機能しません。

> lubridate::ymd("-2255-01-01")
[1] "2255-01-01"

> lubridate::parse_date_time(-2255, "Y")
[1] NA
Warning message:
All formats failed to parse. No formats found.

年が正のDateオブジェクトが返されるためです。 そうは言っても、次の作品は次のとおりです。

> lubridate::ymd("0000-01-01") - lubridate::years(2255)
[1] "-2255-01-01"

ネガティブな年を扱うヘルパー関数を書かせてくれました。

古代(ギリシャやローマ時代など)で働いている人にとって、この機能は非常に役立つことを確認できます。 この問題/選択は、現在、デジタルヒューマニティーズのプロジェクトやコースでRを使用しているTidyverseとlubridate愛好家にとっては大きな問題です。 変更された関数をテストできれば幸いです。

こんにちは! パッケージと周りの作業に感謝します。 誰かがBCE日付を実装すること、またはパッケージをそのまま処理することを検討している場合(1.7.9)、幻のゼロ年によって引き起こされる問題についての考えを以下に示します。

(存在しない)「ゼロ年」への対処

説明

誰かが潤滑油で「西暦前」の日付を扱うことを検討している場合は、 0年目が存在しないことに注意してください(つまり、歴史家にとっては-1年目、次に1年目があります。たとえば、ウィキペディアの年表を参照してください。ユリウス暦の場合、現在使用しているグレゴリオ暦とわずかに競合する可能性があります。これについての詳細はWikipediaで確認できます)。これにより、いくつかの問題が発生する可能性があります。

これらの表記法に慣れていない人のための簡単な説明:

  • CE 」は「
  • BCE 」は「
    例えば。 ソクラテスは紀元前399年に亡くなりました。

たとえば、lubridateはISO 8601(バージョン8601:2004だと思いますか?BCEの日付ISO 8601:2019で処理できますが、ドキュメントのフリーアクセス部分は不明です)に準拠しています。これは0000-01-01から始まります

この記述は、「 0000-01-01 」が0年目であり、「 -001-01-01 」が参照)。以下のコード)。

それはさておき、遭遇した場合、「0CE / AD」または「0BCE / BC」はおそらく-1年目に解析されるべきです。

参考:ウィキペディア( ISO 8601の年ゼロ1 BCコモン時代...)

私の主張をするためのいくつかのコード

(WTFPLの下でライセンス供与:あなたがやりたいことをやりなさい)

pacman::p_load(lubridate)
pacman::p_version(lubridate)
#> [1] '1.7.9'

a <- ymd("0001-01-01")
a
#> [1] "0001-01-01"
# Year 1, no problem

b <- ymd("0000-01-01") - years(1)
b
#> [1] "-001-01-01"
# It is Year -1?
# No, it's -2 even if printed (-001-01-01),
# since ymd("0000-01-01") is already Year -1.

# The problem appears if we compute duration between the two
as.duration(a - b)
#> [1] "63158400s (~2 years)"
# But there is only one year between 1st January -1 and 1st January 1!
# since year zero doesn't exist.

アウグストゥスの日付で説明しましょう:

  • 誕生:紀元前63年9月23日
  • 死:西暦8月19日
  • 死亡年齢:75
aug_birth <- ymd("0000-09-23") - years(63)
aug_death <- ymd("0014-08-19")
age <- aug_death - aug_birth
as.duration(age)
#> [1] "2426889600s (~76.9 years)"
# That's one year too much!

# The correct writing would be:
aug_birth <- ymd("0000-09-23") - years(63 - 1)

したがって、正しいヘルパー関数は、BCEyyyy-mm-ddを解析することです。

parse_bce_ymd <- function(str) {
  regex <- "(\\d{4})(-\\d{2}-\\d{2})"
  match <- stringr::str_match(str, regex)
  years_n <- readr::parse_number(match[, 2]) - 1 # Beware the -1 here
  right_side <- match[, 3]
  date <- ymd(paste0("0000-",right_side)) - years(years_n)
  return(date)
}
# Test the function.
aug_birth <- parse_bce_ymd("0063-09-23")
aug_death <- ymd("0014-08-19")
age <- aug_death - aug_birth
as.duration(age)
#> [1] "2395353600s (~75.9 years)"
# Yay that's correct!

それでも、lubridateは、ゼロ年が存在するかのように、「実際の日付」よりも1年少ない(絶対値が少ない、つまりここでは1年先の)BCE日付を印刷します。これは誤解を招く恐れがあります。

aug_birth
#> [1] "-062-09-23"

最後のコメント(およびデジタルヒューマニティーズプロジェクトでのRおよびTidyverseパッケージの広範な使用)を考慮して、問題を再開できると思いますか、@ vspinu?

このページは役に立ちましたか?
0 / 5 - 0 評価