Por favor, considere o seguinte
$ R --vanilla
> as.Date("01 Jan 2000")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Mas essa data está claramente em um formato padrão não ambíguo. Por que a mensagem de erro?
Pior, uma data ambígua é aparentemente aceita sem aviso ou erro e então lida incorretamente!
> as.Date("01/01/2000")
[1] "0001-01-20"
Eu pesquisei e encontrei 28 outras questões na tag [R] contendo esta mensagem de erro. Tudo com soluções e soluções alternativas envolvendo a especificação do formato, iiuc. Esta pergunta é diferente, pois estou perguntando onde estão os formatos padrão inequívocos definidos de qualquer maneira e eles podem ser alterados? Todos recebem essas mensagens ou sou só eu? Talvez seja relacionado ao local?
Em outras palavras, existe uma solução melhor do que precisar especificar o formato?
29 questões contendo "[R] formato não ambíguo padrão"
> 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
entrada só é testado para estes dois formatos:"%Y-%m-%d"
e"%Y/%m/%d"
. Se puder corresponder a um deles, parece ser considerado "inequívoco".?as.Date
. Onde isso ajuda com isso?strptime(xx, f <- "%d $B %Y", tz = "GMT")
oustrptime(xx, f <- "%B $d %Y", tz = "GMT")
valores retornados. (Não estou sugerindo quemonth.abb
seja usado para a correspondência com% B, pois os documentos dizem que a correspondência é específica do local.)Respostas:
Este é um comportamento documentado. De
?as.Date
:as.Date("01 Jan 2000")
produz um erro porque o formato não é um dos dois listados acima.as.Date("01/01/2000")
produz uma resposta incorreta porque a data não está em um dos dois formatos listados acima.Eu considero "padrão inequívoco" como "ISO-8601" (embora
as.Date
não seja tão estrito, já que "% m /% d /% Y" não é ISO-8601).Se você receber esse erro, a solução é especificar o formato de sua data (ou horários), usando os formatos descritos em
?strptime
. Tenha cuidado especial se seus dados contiverem nomes e / ou abreviações de dias / meses, pois a conversão dependerá de sua localidade (veja os exemplos em?strptime
e leia?LC_TIME
).fonte
"character string is not either %Y-%m-%d or %Y/%m/%d"
??as.Date
(+1). No entanto, a mensagem de erro "formato não ambíguo padrão" é ironicamente ambígua, como atestam as 23 questões anteriores. Uma mensagem de erro mais direta como "formato não reconhecido, consulte a documentação" pode melhorar a experiência do usuário. Além disso, não acredito que "01/01/2000" seja ISO-8601 ("2000-01-01" é ISO-8601), o que aumenta a ambiguidade.as.Date
não reclamar de "01/01/2000" é inconsistente com a mensagem de erro.Sim, existe agora (ou seja, no final de 2016), graças a
anytime::anydate
partir do momento embalagem.Veja o seguinte para alguns exemplos acima:
Como você disse, eles não são ambíguos e devem funcionar. E via
anydate()
eles fazem. Sem formato.fonte
anytime()
é preciso dizer que é igualmente útil paraPOSIXct
.mm-dd
não é uma data (nem é mm-aa ou mm-aaaa). Você não pode analisar o que não está lá.Como complemento à resposta de @JoshuaUlrich, aqui está a definição de função
as.Date.character
:Então, basicamente, se
strptime(x, format="%Y-%m-%d")
estrptime(x, format="%Y/%m/%d")
lançar umNA
, é considerado ambíguo e, se não inequívoco.fonte
Converter a data sem especificar o formato atual pode trazer esse erro para você facilmente.
Aqui está um exemplo:
Converta sem especificar o formato:
Converter com o formato especificado:
fonte
Isso funciona perfeitamente para mim, não importa como a data foi codificada anteriormente.
fonte