Lubridate: dates de la Colombie-Britannique

Créé le 27 mai 2009  ·  7Commentaires  ·  Source: tidyverse/lubridate

Rappelez-vous de vous-même : considérez les dates et l'heure de la Colombie-Britannique (Avant Christ/Avant l'ère commune)

  • Garrett

Tous les 7 commentaires

Salut. Je sais que c'est ancien, mais est-ce que quelqu'un pense à ce problème bce / bc, ou lubridate gère-t-il maintenant cela de manière native?

Quel est le problème plus concrètement. Quel est le modèle d'utilisateur que les gens ont en tête ?

Je ferme ceci. Si quelqu'un insiste sur le fait que cela doit être fait et que cela est utile, veuillez rouvrir.

Eh bien, ce n'est pas que je l'utilise régulièrement, mais j'ai juste travaillé sur un ensemble de données qui avait des années négatives, c'est-à-dire BC, inclus et j'ai eu pas mal de difficultés à le gérer. Par exemple, ce qui suit ne fonctionne pas :

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

puisqu'un objet Date avec une année positive est renvoyé. Cela dit, les travaux suivants :

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

ce qui m'a fait écrire une fonction d'aide qui traite des années négatives.

Je peux confirmer que pour toute personne travaillant sur les périodes anciennes (par exemple les périodes grecques et romaines), cette fonctionnalité serait très utile. Ce problème/choix est actuellement un facteur décisif pour Tidyverse et les passionnés de lubridate utilisant R dans les projets et cours de Digital Humanities. Je serais heureux de tester les fonctions modifiées.

Salut! Merci pour le paquet et le travail fait autour. Si quelqu'un envisage d'implémenter des dates BCE, ou de traiter celles-ci avec le package tel quel (1.7.9), voici quelques réflexions sur les problèmes causés par une année fantôme zéro.

Traiter avec (non existant) "Année zéro"

Explications

Si quelqu'un envisage de traiter des dates "avant l'ère commune" dans lubridate, sachez que l' année zéro n'existe pas (pour les historiens, je veux dire, il y a l'année -1 puis l'année 1, voir par exemple la chronologie de Wikipédia - notez également que c'est pour le calendrier julien, cela pourrait avoir des conflits mineurs avec le calendrier grégorien que nous utilisons de nos jours ; vous trouverez plus de détails à ce sujet sur Wikipedia), et cela peut poser quelques problèmes.

Clarification rapide pour les personnes peu familiarisées avec ces notations :

  • " CE " signifie " Common Era ", qui est une " déchristianisation " de " AD " longtemps et encore utilisé, " Anno Domini " (donc les dates CE pourraient être considérées comme des " années positives ")
  • " BCE " signifie " Before Common Era ", équivalent à " BC ", " Before Christ " ( " années négatives ").
    par exemple. Socrate est mort en 399 avant notre ère.

Par exemple, lubridate suit l'ISO 8601 (version 8601:2004 je présume ? Les dates BCE pourraient être gérées avec ISO 8601:2019 mais la partie en accès libre de la doc n'est pas claire à ce sujet), qui commence à 0000-01-01 , c'est-à-dire le 1er janvier du 1 AEC (Année -1).

Cette écriture est déroutante car elle laisse penser que " 0000-01-01 " est l'année 0, et que " -001-01-01 " est l'année -1 quand c'est l'année -2, et peut causer des problèmes pour calculer les durées ( voir code ci-dessous ).

Cela mis à part, s'il est rencontré, "0 CE/AD" ou "0 BCE/BC" devrait probablement être analysé dans l'année -1.

Références : Wikipedia ( ISO 8601 , Année zéro , 1 BC , Common Era ...)

Un peu de code pour faire mon point

(Sous licence WTFPL : faites ce que vous voulez)

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.

Illustrons avec les dates d' Auguste :

  • naissance : 23 septembre 63 avant notre ère
  • décès: 19 août 14 CE
  • âge au décès : 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)

Ainsi, une fonction d'assistance correcte serait, pour analyser BCE aaaa-mm-jj :

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!

Pourtant, lubridate imprime la date BCE avec un an de moins (moins en valeur absolue, c'est-à-dire un an d'avance ici) que la "vraie", comme s'il existait une année zéro, ce qui est trompeur.

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

Au vu des derniers commentaires (et de l'utilisation généralisée des packages R et Tidyverse dans les projets d'humanités numériques), pensez-vous que le sujet pourrait être rouvert, @vspinu ?

Cette page vous a été utile?
0 / 5 - 0 notes