¿Cuáles son los formatos de "fecha estándar no ambigua"?
(4)
Por favor, considere lo siguiente
$ R --vanilla
> as.Date("01 Jan 2000")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Pero esa fecha claramente está en un formato estándar no ambiguo. ¿Por qué el mensaje de error?
Peor aún, aparentemente se acepta una fecha ambigua sin advertencia o error y luego se lee incorrectamente.
> as.Date("01/01/2000")
[1] "0001-01-20"
He buscado y encontré otras 28 preguntas en la etiqueta [R] que contiene este mensaje de error. Todo con soluciones y soluciones que implican especificar el formato, iiuc. Esta pregunta es diferente, ya que me pregunto dónde están definidos los formatos estándar no ambiguos y pueden cambiarse. ¿Todos reciben estos mensajes o solo soy yo? Tal vez está relacionado con la configuración regional?
En otras palabras, ¿hay una solución mejor que la necesidad de especificar el formato?
29 preguntas que contienen "[R] formato estándar no ambiguo"
> 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
En otras palabras, ¿hay una solución mejor que la necesidad de especificar el formato?
Sí, ahora (es decir, a fines de 2016), gracias a anytime::anydate
del paquete anytime .
Vea lo siguiente para algunos ejemplos de arriba:
R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R>
Como dijiste, estos son inequívocos y deberían funcionar. Y a través de anydate()
lo hacen. Sin un formato.
Como complemento a la respuesta de @JoshuaUlrich, aquí está la definición de función 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>
Así que, básicamente, si tanto strptime(x, format="%Y-%m-%d")
como strptime(x, format="%Y/%m/%d")
arroja una NA
se considera ambigua y si no inequívoca .
Convertir la fecha sin especificar el formato actual puede traerle este error fácilmente.
Aquí hay un ejemplo:
sdate <- "2015.10.10"
Convierta sin especificar el formato:
date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".
Convertir con formato especificado:
date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.
Este es un comportamiento documentado. Desde ?as.Date
:
formato: una cadena de caracteres. Si no se especifica, probará ''"% Y-% m-% d"'' luego ''"% Y /% m /% d"'' en el primer elemento que no sea ''AN'', y dará un error si ninguno de los dos funciona.
as.Date("01 Jan 2000")
produce un error porque el formato no es uno de los dos enumerados anteriormente. as.Date("01/01/2000")
produce una respuesta incorrecta porque la fecha no está en uno de los dos formatos enumerados anteriormente.
Tomo "estándar inequívoco" para significar "ISO-8601" (aunque como as.Date
no es tan estricto, ya que "% m /% d /% Y" no es ISO-8601).
Si recibe este error, la solución es especificar el formato en que se encuentran su fecha (o fechas), utilizando los formatos descritos en ?strptime
. Asegúrese de tener un cuidado especial si sus datos contienen nombres y / o abreviaturas de día / mes, ya que la conversión dependerá de su localidad (vea los ejemplos en ?strptime
y lea ?LC_TIME
).