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 est 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 de manière incorrecte!
> as.Date("01/01/2000")
[1] "0001-01-20"
J'ai cherché et trouvé 28 autres questions dans la balise [R] contenant ce message d'erreur. Tous avec des solutions et des solutions de contournement impliquant la spécification du format, iiuc. Cette question est différente en ce sens que je demande où sont définis les formats standard sans ambiguïté, 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 lieux?
En d'autres termes, existe-t-il une meilleure solution que de spécifier le format?
29 questions contenant "[R] format standard sans ambiguïté"
> 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
C'est un comportement documenté. De ?as.Date
:
format: une chaîne de caractères. S'il n'est pas spécifié, il essaiera ""% Y-% m-% d "" puis ""% Y /% m /% d "" sur le premier élément non-'NA 'et donnera une erreur si aucun des deux ne fonctionne.
as.Date("01 Jan 2000")
génère une erreur car le format n'est pas l'un des deux énumérés ci-dessus. as.Date("01/01/2000")
donne une réponse incorrecte car la date ne figure pas dans l'un des deux formats énumérés ci-dessus.
Je suppose que "norme sans ambiguïté" signifie "ISO-8601" (même si 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 de vos dates-heures), en utilisant les formats décrits dans ?strptime
. Faites particulièrement attention si vos données contiennent des noms de jour/mois et/ou des abréviations, car la conversion dépend de votre environnement local (voir les exemples dans ?strptime
et lisez ?LC_TIME
).
En complément de la réponse @JoshuaUlrich, voici la définition de la fonction as.Date.character
:
as.Date.character
function (x, format = "", ...)
{
charToDate <- function(x) {
xx <- x[1L]
if (is.na(xx)) {
j <- 1L
while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j]
if (is.na(xx))
f <- "%Y-%m-%d"
}
if (is.na(xx) || !is.na(strptime(xx, f <- "%Y-%m-%d",
tz = "GMT")) || !is.na(strptime(xx, f <- "%Y/%m/%d",
tz = "GMT")))
return(strptime(x, f))
stop("character string is not in a standard unambiguous format")
}
res <- if (missing(format))
charToDate(x)
else strptime(x, format, tz = "GMT")
as.Date(res)
}
<bytecode: 0x265b0ec>
<environment: namespace:base>
Donc, fondamentalement, si strptime(x, format="%Y-%m-%d")
et strptime(x, format="%Y/%m/%d")
jettent un NA
, il est considéré comme ambigu et s’il n’est pas non ambigu.
En d'autres termes, existe-t-il une meilleure solution que de spécifier le format?
Oui, il y en a maintenant (c'est-à-dire à la fin de 2016), grâce à anytime::anydate
du paquet à tout moment .
Voir ci-dessous quelques exemples ci-dessus:
R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R>
Comme vous l'avez dit, ce sont en fait sans ambiguïté et devraient fonctionner. Et via anydate()
ils le font. Sans format.
Convertir la date sans spécifier le format actuel peut vous apporter facilement cette erreur.
sdate <- "2015.10.10"
date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".
date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.
Cela fonctionne parfaitement pour moi, peu importe comment la date a été codée précédemment.
library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)