r

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