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 inequívoco. ¿Por qué el mensaje de error?
Peor aún, una fecha ambigua aparentemente se acepta sin advertencia ni error y luego se lee incorrectamente.
> as.Date("01/01/2000")
[1] "0001-01-20"
He buscado y encontrado otras 28 preguntas en la etiqueta [R] que contienen este mensaje de error. Todo con soluciones y soluciones alternativas que implican especificar el formato, iiuc. Esta pregunta es diferente porque estoy preguntando dónde se definen los formatos estándar inequívocos de todos modos, y ¿se pueden cambiar? ¿Todos reciben estos mensajes o soy solo yo? ¿Quizás esté relacionado con la configuración regional?
En otras palabras, ¿hay una solución mejor que tener que especificar el formato?
29 preguntas que contienen "[R] formato estándar sin ambigüedades"
> 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
la entrada, solo se prueba para estos dos formatos:"%Y-%m-%d"
y"%Y/%m/%d"
. Si puede coincidir con uno de ellos, parece que se considera "inequívoco".?as.Date
. ¿Dónde ayuda con esto?strptime(xx, f <- "%d $B %Y", tz = "GMT")
ostrptime(xx, f <- "%B $d %Y", tz = "GMT")
valores devueltos. (No estoy insinuando quemonth.abb
se use para la coincidencia con% B, ya que los documentos dicen que la coincidencia es específica de la configuración regional).Respuestas:
Este es un comportamiento documentado. De
?as.Date
:as.Date("01 Jan 2000")
produce un error porque el formato no es uno de los dos enumerados anteriormente.as.Date("01/01/2000")
da una respuesta incorrecta porque la fecha no está en uno de los dos formatos enumerados anteriormente.Considero que "estándar no ambiguo" significa "ISO-8601" (aunque
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 el que se encuentran su fecha (o fecha y hora), utilizando los formatos descritos en
?strptime
. Asegúrese de tener especial cuidado si sus datos contienen nombres de días / meses y / o abreviaturas, ya que la conversión dependerá de su ubicación (vea los ejemplos en?strptime
y lea?LC_TIME
).fuente
"character string is not either %Y-%m-%d or %Y/%m/%d"
??as.Date
(+1). Sin embargo, el mensaje de error "formato estándar sin ambigüedades" es irónicamente ambiguo, como lo atestiguan las 23 preguntas anteriores. Un mensaje de error más directo como "formato no reconocido, ver documentación" podría mejorar la experiencia del usuario. Además, no creo que "01/01/2000" sea ISO-8601 ("2000-01-01" es ISO-8601), lo que aumenta la ambigüedad.as.Date
no quejarse de "01/01/2000" es incompatible con el mensaje de error.Sí, hay ahora (es decir, a finales de 2016), gracias a
anytime::anydate
desde el momento paquete.Consulte lo siguiente para ver algunos ejemplos anteriores:
Como dijiste, estos son de hecho inequívocos y deberían funcionar. Y a través de
anydate()
ellos lo hacen. Sin formato.fuente
anytime()
es igualmente útil paraPOSIXct
.mm-dd
no es una fecha (ni mm-aa ni mm-aaaa). No puede analizar lo que no está allí.Como complemento a la respuesta de @JoshuaUlrich, aquí está la definición de función
as.Date.character
:Entonces, básicamente, si ambos
strptime(x, format="%Y-%m-%d")
ystrptime(x, format="%Y/%m/%d")
arrojan unNA
, se considera ambiguo y, si no, inequívoco.fuente
Convertir la fecha sin especificar el formato actual puede traerle este error fácilmente.
Aquí hay un ejemplo:
Convertir sin especificar el formato:
Convertir con formato especificado:
fuente
Esto funciona perfectamente para mí, sin importar cómo se codificó la fecha anteriormente.
fuente