web-dev-qa-db-fra.com

Quels sont les formats de "date standard non ambiguë" pour la conversion chaîne à date en R?

Veuillez considérer ce qui suit

$ R --Vanilla

> as.Date("01 Jan 2000")
Error in charToDate(x) :
    character string is not in a standard unambiguous format

Mais cette date est clairement est dans un format standard non ambigu. Pourquoi le message d'erreur?

Pire encore, une date ambiguë est apparemment acceptée sans avertissement ni erreur, puis lue de manière incorrecte!

> as.Date("01/01/2000")
[1] "0001-01-20"

J'ai cherché et trouvé 28 autres questions dans la balise [R] contenant ce message d'erreur. Tous avec des solutions et des solutions de contournement impliquant la spécification du format, iiuc. Cette question est différente en ce sens que je demande où sont définis les formats standard sans ambiguïté, et peuvent-ils être modifiés? Est-ce que tout le monde reçoit ces messages ou est-ce juste moi? Peut-être est-ce lié aux lieux?

En d'autres termes, existe-t-il une meilleure solution que de spécifier le format?

29 questions contenant "[R] format standard sans ambiguïté"

> 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

C'est un comportement documenté. De ?as.Date:

format: une chaîne de caractères. S'il n'est pas spécifié, il essaiera ""% Y-% m-% d "" puis ""% Y /% m /% d "" sur le premier élément non-'NA 'et donnera une erreur si aucun des deux ne fonctionne.

as.Date("01 Jan 2000") génère une erreur car le format n'est pas l'un des deux énumérés ci-dessus. as.Date("01/01/2000") donne une réponse incorrecte car la date ne figure pas dans l'un des deux formats énumérés ci-dessus.

Je suppose que "norme sans ambiguïté" signifie "ISO-8601" (même si as.Date n'est pas si strict, car "% m /% d /% Y" n'est pas ISO-8601).

Si vous recevez cette erreur, la solution consiste à spécifier le format de votre date (ou de vos dates-heures), en utilisant les formats décrits dans ?strptime. Faites particulièrement attention si vos données contiennent des noms de jour/mois et/ou des abréviations, car la conversion dépend de votre environnement local (voir les exemples dans ?strptime et lisez ?LC_TIME).

60
Joshua Ulrich

En complément de la réponse @JoshuaUlrich, voici la définition de la fonction 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>

Donc, fondamentalement, si strptime(x, format="%Y-%m-%d") et strptime(x, format="%Y/%m/%d") jettent un NA, il est considéré comme ambigu et s’il n’est pas non ambigu.

25
plannapus

En d'autres termes, existe-t-il une meilleure solution que de spécifier le format?

Oui, il y en a maintenant (c'est-à-dire à la fin de 2016), grâce à anytime::anydate du paquet à tout moment .

Voir ci-dessous quelques exemples ci-dessus:

R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R> 

Comme vous l'avez dit, ce sont en fait sans ambiguïté et devraient fonctionner. Et via anydate() ils le font. Sans format.

25
Dirk Eddelbuettel

Convertir la date sans spécifier le format actuel peut vous apporter facilement cette erreur.

Voici un exemple:

sdate <- "2015.10.10"

Convertir sans spécifier le format:

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

Convertir avec le format spécifié:

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

Cela fonctionne parfaitement pour moi, peu importe comment la date a été codée précédemment.

library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)
0
Viviana Wu