wake-up-neo.com

Was sind die "standardmäßigen eindeutigen Datumsformate" für die Konvertierung von Zeichenfolgen zu Datum in R?

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
79
Matt Dowle

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

60
Joshua Ulrich

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.

25
plannapus

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.

25

Das Konvertieren des Datums ohne Angabe des aktuellen Formats kann Ihnen diesen Fehler leicht machen.

Hier ist ein Beispiel:

sdate <- "2015.10.10"

Konvertieren ohne Angabe des Formats:

date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".

Mit angegebenem Format konvertieren:

date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.
4

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)
0
Viviana Wu