Bitte beachten Sie Folgendes
$ R --vanilla
> as.Date("01 Jan 2000")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Aber zu diesem Zeitpunkt klar ist in einem Standard - Format eindeutig. Warum die Fehlermeldung?
Schlimmer noch, ein mehrdeutiges Datum wird anscheinend ohne Vorwarnung oder Fehler akzeptiert und dann falsch gelesen!
> as.Date("01/01/2000")
[1] "0001-01-20"
Ich habe 28 andere Fragen im [R] -Tag gesucht und gefunden, die diese Fehlermeldung enthalten. Alle mit Lösungen und Problemumgehungen, bei denen das Format angegeben wird, iiuc. Diese Frage unterscheidet sich darin, dass ich frage, wo die standardmäßigen eindeutigen Formate überhaupt definiert sind und ob sie geändert werden können. Bekommt jeder diese Nachrichten oder bin es nur ich? Vielleicht hängt es mit dem Gebietsschema zusammen?
Mit anderen Worten, gibt es eine bessere Lösung, als das Format angeben zu müssen?
29 Fragen mit "[R] Standard eindeutiges Format"
> 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
der Eingabe zu urteilen, wird nur für diese beiden Formate getestet:"%Y-%m-%d"
und"%Y/%m/%d"
. Wenn es mit einem von ihnen übereinstimmen kann, scheint es als "eindeutig" zu gelten.?as.Date
. Wo hilft es dabei?strptime(xx, f <- "%d $B %Y", tz = "GMT")
oderstrptime(xx, f <- "%B $d %Y", tz = "GMT")
Werte zurückgegeben werden. (Ich impliziere nicht, dass diesmonth.abb
für das Matching mit% B verwendet wird, da die Dokumente sagen, dass das Matching länderspezifisch ist.)Antworten:
Dies ist dokumentiertes Verhalten. Von
?as.Date
:as.Date("01 Jan 2000")
gibt einen Fehler aus, da das Format nicht eines der beiden oben aufgeführten ist.as.Date("01/01/2000")
ergibt eine falsche Antwort, da das Datum nicht in einem der beiden oben aufgeführten Formate vorliegt.Ich verstehe "Standard eindeutig" als "ISO-8601" (obwohl dies
as.Date
nicht so streng ist, da "% m /% d /% Y" nicht ISO-8601 ist).Wenn Sie diesen Fehler erhalten, besteht die Lösung darin, das Format Ihres Datums (oder Ihrer Datums- / Uhrzeitangaben) in den unter beschriebenen Formaten anzugeben
?strptime
. Seien Sie besonders vorsichtig, wenn Ihre Daten Tages- / Monatsnamen und / oder Abkürzungen enthalten, da die Konvertierung von Ihrem Gebietsschema abhängt (siehe Beispiele in?strptime
und lesen Sie?LC_TIME
).quelle
"character string is not either %Y-%m-%d or %Y/%m/%d"
??as.Date
(+1) dokumentiert . Die Fehlermeldung "Standard eindeutiges Format" ist jedoch ironischerweise mehrdeutig, was die 23 vorherigen Fragen bestätigen. Eine direktere Fehlermeldung wie "Format nicht erkannt, siehe Dokumentation" kann die Benutzererfahrung verbessern. Ich glaube auch nicht, dass "01/01/2000" ISO-8601 ist ("2000-01-01" ist ISO-8601), was die Mehrdeutigkeit erhöht.as.Date
nicht mit der Fehlermeldung vereinbar ist, sich nicht über "01/01/2000" zu beschweren.Ja, es gibt jetzt (dh Ende 2016) dank
anytime::anydate
des jederzeit verfügbaren Pakets.Im Folgenden finden Sie einige Beispiele von oben:
Wie Sie sagten, sind diese in der Tat eindeutig und sollten einfach funktionieren. Und über
anydate()
sie. Ohne Format.quelle
anytime()
ist es ebenso nützlich fürPOSIXct
.mm-dd
ist kein Datum (auch nicht MM-JJ oder MM-JJJJ). Sie können nicht analysieren, was es nicht gibt.Als Ergänzung zur Antwort von @JoshuaUlrich folgt hier die Definition der Funktion
as.Date.character
:Wenn also beides
strptime(x, format="%Y-%m-%d")
und einstrptime(x, format="%Y/%m/%d")
geworfen wirdNA
, wird es als mehrdeutig und wenn nicht eindeutig angesehen.quelle
Das Konvertieren des Datums ohne Angabe des aktuellen Formats kann diesen Fehler leicht verursachen.
Hier ist ein Beispiel:
Konvertieren ohne Angabe des Formats:
Mit angegebenem Format konvertieren:
quelle
Dies funktioniert perfekt für mich, egal wie das Datum zuvor codiert wurde.
quelle