Lubridate: Fechas antes de Cristo

Creado en 27 may. 2009  ·  7Comentarios  ·  Fuente: tidyverse/lubridate

Recuerde: considere las fechas y la hora antes de Cristo (antes de Cristo / antes de la era común)

  • Garrett

Todos 7 comentarios

Hola. Sé que esto es antiguo, pero ¿alguien está pensando en este problema bce / bc, o lubridate ahora maneja esto de forma nativa?

¿Cuál es el problema más concretamente? ¿Cuál es el patrón de usuario que la gente tiene en mente?

Estoy cerrando esto. Si alguien insiste en que esto debe hacerse y es útil, vuelva a abrir.

Bueno, no es que use esto con regularidad, pero solo trabajé en un conjunto de datos que tenía años negativos, es decir, BC, incluido y tenía bastantes dificultades para lidiar con él. Por ejemplo, lo siguiente no funciona:

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

ya que se devuelve un objeto Date con año positivo. Dicho esto, lo siguiente funciona:

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

lo que me hizo escribir una función auxiliar que se ocupa de los años negativos.

Puedo confirmar que para cualquiera que trabaje en períodos antiguos (por ejemplo, períodos griego y romano) esta característica sería muy útil. Este problema / elección es actualmente un factor decisivo para Tidyverse y los entusiastas de lubridate usan R en proyectos y cursos de Humanidades Digitales. Estaría feliz de probar las funciones modificadas.

¡Hola! Gracias por el paquete y el trabajo realizado. Si alguien considera implementar fechas BCE, o tratar con las del paquete tal como está (1.7.9), aquí hay algunas ideas sobre los problemas causados ​​por un año fantasma cero.

Tratar con (no existente) "Año cero"

Explicaciones

Si alguien está considerando lidiar con fechas "anteriores a la era común" en lubridate, tenga en cuenta que el año cero no existe (para los historiadores, quiero decir, hay el año -1 y luego el año 1, consulte, por ejemplo, la cronología de Wikipedia ; también tenga en cuenta que es para el calendario juliano, eso podría tener conflictos menores con el calendario gregoriano que usamos hoy en día; encontrará más detalles sobre esto en Wikipedia), y eso puede causar algunos problemas.

Aclaración rápida para personas que no estén familiarizadas con esas notaciones:

  • " CE " significa "Era Común", que es una "descristianización" de "AD", "Anno Domini", que todavía se utiliza durante mucho tiempo (por lo que las fechas CE podrían verse como "años positivos")
  • " BCE " significa "Antes de la Era Común", equivalente a "BC", "Antes de Cristo" ("años negativos").
    p.ej. Sócrates murió en 399 a. C.

Por ejemplo, lubridate sigue la norma ISO 8601 (supongo que la versión 8601: 2004 ? Las fechas BCE podrían manejarse con ISO 8601: 2019 pero la parte de acceso libre del documento no está clara al respecto), que comienza en 0000-01-01 , es decir, el 1 de enero del 1 a. C. (año -1).

Esta escritura es confusa porque deja pensar que " 0000-01-01 " es el año 0, y que " -001-01-01 " es el año -1 cuando es el año -2, y puede causar problemas para calcular las duraciones ( consulte código a continuación ).

Aparte de eso, si se encuentra, "0 EC / AD" o "0 BCE / BC" probablemente debería analizarse en el año -1.

Referencias: Wikipedia ( ISO 8601 , año cero , 1 a.C. , era común ...)

Algún código para hacer mi punto

(Licencia bajo WTFPL: Haz lo que quieras)

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.

Ilustremos con las fechas de Augustus :

  • nacimiento: 23 de septiembre de 63 a. C.
  • muerte: 19 de agosto de 14 d.C.
  • edad al morir: 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)

Entonces, una función de ayuda correcta sería analizar BCE yyyy-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!

Aún así, lubridate imprime la fecha BCE con un año menos (menos en valor absoluto, es decir, un año adelante aquí) que el "real", como si existiera un año cero, lo cual es engañoso.

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

En vista de los últimos comentarios (y el uso generalizado de los paquetes R y Tidyverse en proyectos de humanidades digitales), ¿crees que el tema podría reabrirse, @vspinu?

¿Fue útil esta página
0 / 5 - 0 calificaciones