Lubridate: Datas AC

Criado em 27 mai. 2009  ·  7Comentários  ·  Fonte: tidyverse/lubridate

Lembre-se: considere as datas e hora AC (antes de Cristo / antes da era comum)

  • Garrett

Todos 7 comentários

Oi. Eu sei que isso é antigo, mas alguém está pensando sobre este problema bce / bc, ou o lubrificado agora lida com isso nativamente?

Qual é o problema mais concretamente. Qual é o padrão de usuário que as pessoas têm em mente?

Estou fechando isso. Se alguém insistir que isso deve ser feito e é útil, reabra.

Bem, não que eu use isso regularmente, mas eu apenas trabalhei em um conjunto de dados que tinha anos negativos, ou seja, BC, incluídos e tive algumas dificuldades para lidar com isso. Por exemplo, o seguinte não 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.

já que um objeto Date com ano positivo é retornado. Dito isso, funciona o seguinte:

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

o que me fez escrever uma função auxiliar que lida com anos negativos.

Posso confirmar que para quem está trabalhando em períodos antigos (por exemplo, períodos gregos e romanos) esse recurso seria muito útil. Este problema / escolha é atualmente um fator decisivo para os entusiastas do Tidyverse e de lubridate usam R em projetos e cursos de Humanidades Digitais. Eu ficaria feliz em testar as funções modificadas.

Oi! Obrigado pelo pacote e pelo trabalho realizado. Se alguém considera a implementação de datas BCE, ou lidar com aqueles com o pacote como está (1.7.9), aqui estão algumas idéias sobre os problemas causados ​​por um ano zero fantasma.

Lidando com (não existente) "Ano zero"

Explicações

Se alguém está pensando em lidar com datas "antes da era comum" no lubrificado, esteja ciente de que o ano zero não existe (para os historiadores, quero dizer, há o Ano -1 e o Ano 1, veja por exemplo a cronologia da

Esclarecimento rápido para pessoas não familiarizadas com essas notações:

  • " CE " significa "Era Comum", que é uma "descristianização" de "AD" longo e ainda usado, "Anno Domini" (portanto, datas CE podem ser vistas como "anos positivos")
  • " AC " significa "Antes da Era Comum", equivalente a "AC", "Antes de Cristo" ("anos negativos").
    por exemplo. Sócrates morreu em 399 AEC.

Por exemplo, lubrificado segue a norma ISO 8601 (versão 8601: 2004 presumo? As datas de AEC podem ser tratadas com ISO 8601: 2019, mas a parte de acesso livre do documento não é clara sobre isso), que começa em 0000-01-01 , isto é, 1º de janeiro de 1 AEC (Ano -1).

Esta escrita é confusa porque leva a pensar que " 0000-01-01 " é o Ano 0, e que " -001-01-01 " é o Ano -1 quando é o Ano -2, e pode causar problemas para calcular as durações ( consulte código abaixo ).

Fora isso, se encontrado, "0 EC / AD" ou "0 AC / BC" provavelmente deve ser analisado no Ano -1.

Referências: Wikipedia ( ISO 8601 , ano zero , 1 aC , era comum ...)

Algum código para fazer meu ponto

(Licenciado pela WTFPL: Faça o que quiser)

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.

Vamos ilustrar com datas de Augusto :

  • nascimento: 23 de setembro de 63 a.C.
  • morte: 19 de agosto, 14 dC
  • idade na morte: 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)

Portanto, uma função auxiliar correta seria, para analisar BCE aaaa-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!

Ainda assim, lubrifique a impressão da data AEC com um ano a menos (menos em valor absoluto, isto é, um ano à frente) do que o "real", como se existisse um ano zero, o que é enganoso.

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

Tendo em vista os últimos comentários (e o uso generalizado de pacotes R e Tidyverse em projetos de humanidades digitais), você acha que o assunto poderia ser reaberto, @vspinu?

Esta página foi útil?
0 / 5 - 0 avaliações