Lubridate: BC-Daten

Erstellt am 27. Mai 2009  ·  7Kommentare  ·  Quelle: tidyverse/lubridate

Denken Sie an sich selbst: Berücksichtigen Sie Datum und Uhrzeit vor Christus (vor Christus / vor der heutigen Zeit)

  • Garrett

Alle 7 Kommentare

Hallo. Ich weiß, dass dies uralt ist, aber denkt jemand über dieses bce / bc-Problem nach, oder behandelt Lubridate dies jetzt nativ?

Was ist das Problem konkreter. Welches Nutzerverhalten haben die Leute im Sinn?

Ich schließe das. Wenn jemand darauf besteht, dass dies getan werden sollte und nützlich ist, öffnen Sie bitte erneut.

Nun, nicht, dass ich das regelmäßig benutze, aber ich habe gerade an einem Datensatz gearbeitet, der negative Jahre, dh BC, enthält, und hatte ziemliche Schwierigkeiten damit umzugehen. ZB geht folgendes nicht:

> 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.

da ein Date-Objekt mit positivem Jahr zurückgegeben wird. Das heißt, Folgendes funktioniert:

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

was mich dazu brachte, eine Hilfsfunktion zu schreiben, die sich mit negativen Jahren befasst.

Ich kann bestätigen, dass diese Funktion für jeden, der mit antiken Perioden (zB griechischen und römischen Perioden) arbeitet, sehr nützlich wäre. Dieses Problem/diese Wahl ist derzeit ein Deal Breaker für Tidyverse- und lubridate Enthusiasten, die R in Digital Humanities-Projekten und -Kursen verwenden. Gerne teste ich die geänderten Funktionen.

Hallo! Danke für das Paket und die geleistete Arbeit. Wenn jemand erwägt, BCE-Datumsdaten zu implementieren oder sich mit den Paketen so zu befassen, wie sie sind (1.7.9), hier einige Gedanken zu Problemen, die durch ein Phantomjahr Null verursacht werden.

Umgang mit (nicht vorhanden) "Jahr Null"

Erklärungen

Wenn jemand erwägt, sich mit Daten "vor der gemeinsamen Ära" in Lubridate zu befassen, beachten Sie, dass das Jahr Null nicht existiert (für Historiker meine ich, es gibt Jahr -1 und dann Jahr 1, siehe zum Beispiel die Wikipedia-Chronologie – beachten Sie auch das für den Julianischen Kalender, der kleinere Konflikte mit dem Gregorianischen Kalender haben könnte, den wir heute verwenden; mehr Details dazu finden Sie auf Wikipedia) und das kann einige Probleme verursachen.

Schnelle Erläuterung für Personen, die mit diesen Notationen nicht vertraut sind:

  • CE “ steht für „Common Era“, was eine „Entchristianisierung“ von lange und noch immer gebrauchtem „AD“, „Anno Domini“ ist (daher könnten CE-Daten als „positive Jahre“ angesehen werden)
  • BCE “ steht für „Before Common Era“, äquivalent zu „BC“, „Before Christ“ („negative Years“).
    z.B. Sokrates starb 399 v.

Lubridate folgt zum Beispiel der ISO 8601 (Version 8601:2004 , nehme ich an? BCE-Daten könnten mit ISO 8601:2019 behandelt werden, aber der frei zugängliche Teil des Dokuments ist darüber unklar), was bei 0000-01-01 beginnt , das ist der 1. Januar 1 v. Chr. (Jahr -1).

Dieses Schreiben ist verwirrend, weil es zu denken lässt, dass " 0000-01-01 " das Jahr 0 ist und dass " -001-01-01 " das Jahr -1 ist, wenn es das Jahr -2 ist, und kann Probleme bei der Berechnung der Dauer verursachen ( siehe Code unten ).

Abgesehen davon, sollte "0 CE/AD" oder "0 BCE/BC" wahrscheinlich in Jahr -1 geparst werden, wenn es angetroffen wird.

Referenzen: Wikipedia ( ISO 8601 , Jahr Null , 1 v. Chr. , Common Era ...)

Ein Code, um meinen Standpunkt zu verdeutlichen

(Lizenziert unter WTFPL: Tun Sie, was Sie zum Teufel wollen)

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.

Lassen Sie uns mit Augustus- Daten illustrieren:

  • Geburt: 23. September 63 v. Chr.
  • Tod: 19. August 14 CE
  • Alter beim Tod: 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)

Eine korrekte Hilfsfunktion wäre also, BCE yyyy-mm-dd zu parsen:

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!

Dennoch schmieren Sie das BCE-Datum mit einem Jahr weniger (absolut weniger, das ist hier ein Jahr voraus) als das "echte" Datum, als ob es ein Nulljahr gäbe, was irreführend ist.

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

Glauben Sie, dass das Thema angesichts der letzten Kommentare (und der weit verbreiteten Verwendung von R- und Tidyverse-Paketen in Digital-Humanities-Projekten) wieder aufgegriffen werden könnte, @vspinu?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ClaytonJY picture ClaytonJY  ·  5Kommentare

MichaelJW picture MichaelJW  ·  7Kommentare

gavinsimpson picture gavinsimpson  ·  27Kommentare

awfrankwils picture awfrankwils  ·  7Kommentare

dominicroye picture dominicroye  ·  9Kommentare