Bitte beachten Sie folgendes
$ R --Vanilla
> as.Date("01 Jan 2000")
Error in charToDate(x) :
character string is not in a standard unambiguous format
Dieses Datum hat jedoch eindeutig ein Standardformat . Warum die Fehlermeldung?
Schlimmer noch, ein mehrdeutiges Datum wird anscheinend ohne Vorwarnung oder Irrtum akzeptiert und dann falsch gelesen!
> as.Date("01/01/2000")
[1] "0001-01-20"
Ich habe im [R] -Tag, das diese Fehlermeldung enthält, 28 andere Fragen gesucht und gefunden. Alles mit Lösungen und Problemumgehungen, bei denen das Format angegeben wird, iiuc. Diese Frage unterscheidet sich darin, dass ich frage, wo die eindeutigen Standardformate ü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 eindeutigem 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
Dies ist dokumentiertes Verhalten. Von ?as.Date
:
format: Eine Zeichenkette. Wenn nicht angegeben, wird '% Y-% m-% d' und dann '% Y /% m /% d' für das erste Nicht-'NA'-Element versucht und ein Fehler ausgegeben, wenn keines der beiden Elemente funktioniert.
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")
gibt eine falsche Antwort aus, da das Datum nicht in einem der beiden oben aufgeführten Formate vorliegt.
Ich verstehe "Standard eindeutig" als "ISO-8601" (obwohl as.Date
Nicht so streng ist, da "% m /% d /% Y" nicht ISO-8601 ist).
Wenn Sie diese Fehlermeldung erhalten, können Sie das Format Ihres Datums (oder Ihrer Datumszeiten) in den unter ?strptime
Beschriebenen Formaten angeben. Seien Sie besonders vorsichtig, wenn Ihre Daten Tag-/Monatsnamen und/oder Abkürzungen enthalten, da die Konvertierung von Ihrem Gebietsschema abhängt (siehe Beispiele in ?strptime
Und lesen Sie ?LC_TIME
).
Als Ergänzung zur Antwort von @JoshuaUlrich ist hier die Definition der Funktion 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>
Wenn also sowohl strptime(x, format="%Y-%m-%d")
als auch strptime(x, format="%Y/%m/%d")
ein NA
auslösen, wird dies als mehrdeutig und wenn nicht eindeutig angesehen.
Mit anderen Worten, gibt es eine bessere Lösung, als das Format angeben zu müssen?
Ja, das gibt es jetzt (dh Ende 2016), dank anytime::anydate
Aus dem jederzeit -Paket.
Im Folgenden finden Sie einige Beispiele von oben:
R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R>
Wie Sie sagten, sind diese tatsächlich eindeutig und sollten einfach funktionieren. Und über anydate()
tun sie es. Ohne Format.
Das Konvertieren des Datums ohne Angabe des aktuellen Formats kann Ihnen diesen Fehler leicht machen.
sdate <- "2015.10.10"
date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".
date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.
Dies funktioniert perfekt für mich, egal wie das Datum zuvor codiert wurde.
library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)