Veuillez considérer ce qui suit
$ R --vanilla
> as.Date("01 Jan 2000")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Mais cette date est clairement dans un format standard non ambigu. Pourquoi le message d'erreur?
Pire encore, une date ambiguë est apparemment acceptée sans avertissement ni erreur puis lue incorrectement!
> as.Date("01/01/2000")
[1] "0001-01-20"
J'ai recherché et trouvé 28 autres questions dans la balise [R] contenant ce message d'erreur. Le tout avec des solutions et des contournements impliquant la spécification du format, iiuc. Cette question est différente en ce que je demande où sont les formats standard non ambigus définis de toute façon, et peuvent-ils être modifiés? Est-ce que tout le monde reçoit ces messages ou est-ce juste moi? Peut-être est-ce lié aux paramètres régionaux?
En d'autres termes, y a-t-il une meilleure solution que de devoir spécifier le format?
29 questions contenant "[R] format standard non ambigu"
> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252
[2] LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
as.Date.character
l'entrée n'est testé que pour ces deux formats:"%Y-%m-%d"
et"%Y/%m/%d"
. S'il peut correspondre à l'un d'entre eux, il semble être considéré comme "sans ambiguïté".?as.Date
. Où cela aide-t-il à cela?strptime(xx, f <- "%d $B %Y", tz = "GMT")
ou desstrptime(xx, f <- "%B $d %Y", tz = "GMT")
valeurs renvoyées. (Je ne veux pas dire quemonth.abb
c'est utilisé pour la correspondance avec% B puisque la documentation indique que la correspondance est spécifique à la locale.)Réponses:
Il s'agit d'un comportement documenté. De
?as.Date
:as.Date("01 Jan 2000")
génère une erreur car le format n'est pas l'un des deux répertoriés ci-dessus.as.Date("01/01/2000")
renvoie une réponse incorrecte car la date n'est pas dans l'un des deux formats répertoriés ci-dessus.Je prends «standard sans ambiguïté» pour signifier «ISO-8601» (même si ce
as.Date
n'est pas si strict, car «% m /% d /% Y» n'est pas ISO-8601).Si vous recevez cette erreur, la solution consiste à spécifier le format de votre date (ou datetimes), en utilisant les formats décrits dans
?strptime
. Assurez-vous de faire particulièrement attention si vos données contiennent des noms de jour / mois et / ou des abréviations, car la conversion dépendra de vos paramètres régionaux (voir les exemples dans?strptime
et lire?LC_TIME
).la source
"character string is not either %Y-%m-%d or %Y/%m/%d"
??as.Date
(+1). Cependant, le message d'erreur "format standard non ambigu" est ironiquement ambigu, ce dont témoignent les 23 questions précédentes. Un message d'erreur plus direct comme "format non reconnu, voir la documentation" peut améliorer l'expérience utilisateur. De plus, je ne crois pas que "01/01/2000" soit ISO-8601 ("2000-01-01" est ISO-8601), ce qui ajoute à l'ambiguïté.as.Date
ne pas se plaindre de "01/01/2000" est incompatible avec le message d'erreur.Oui, il est maintenant (c. - à la fin de 2016), grâce à
anytime::anydate
du moment paquet.Voir ci-dessous quelques exemples ci-dessus:
Comme vous l'avez dit, ceux-ci sont en fait sans ambiguïté et devraient tout simplement fonctionner. Et via
anydate()
ils le font. Sans format.la source
anytime()
est également utile pourPOSIXct
.mm-dd
n'est pas une date (ni mm-aa ou mm-aaaa). Vous ne pouvez pas analyser ce qu'il n'y a pas.En complément de la réponse @JoshuaUlrich, voici la définition de la fonction
as.Date.character
:Donc, fondamentalement, si les deux
strptime(x, format="%Y-%m-%d")
etstrptime(x, format="%Y/%m/%d")
jette un,NA
il est considéré comme ambigu et sinon sans ambiguïté.la source
La conversion de la date sans spécifier le format actuel peut vous apporter cette erreur facilement.
Voici un exemple:
Convertir sans spécifier le format:
Convertir avec le format spécifié:
la source
Cela fonctionne parfaitement pour moi, peu importe comment la date a été codée précédemment.
la source