Lembre-se: considere as datas e hora AC (antes de Cristo / antes da era comum)
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.
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 ...)
(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 :
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?