106 votes

Différence entre as.POSIXct/as.POSIXlt et strptime pour la conversion des vecteurs de caractères en POSIXct/POSIXlt

J'ai suivi un certain nombre de questions ici qui demandent comment convertir des vecteurs de caractères en classes de temps de date. Je vois souvent 2 méthodes, la strptime et les méthodes as.POSIXct/as.POSIXlt. J'ai regardé les 2 fonctions mais je ne vois pas bien quelle est la différence.

strptime

function (x, format, tz = "") 
{
    y <- .Internal(strptime(as.character(x), format, tz))
    names(y$year) <- names(x)
    y
}
<bytecode: 0x045fcea8>
<environment: namespace:base>

as.POSIXct

function (x, tz = "", ...) 
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>

comme.POSIXlt

function (x, tz = "", ...) 
UseMethod("as.POSIXlt")
<bytecode: 0x03ac029c>
<environment: namespace:base>

Faire un microbenchmark pour voir s'il y a des différences de performance :

library(microbenchmark)
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 5000, replace = TRUE)
df <- microbenchmark(strptime(Dates, "%d-%m-%Y"), as.POSIXlt(Dates, format = "%d-%m-%Y"), times = 1000)

Unit: milliseconds
                                    expr      min       lq   median       uq      max
1 as.POSIXlt(Dates, format = "%d-%m-%Y") 32.38596 33.81324 34.78487 35.52183 61.80171
2            strptime(Dates, "%d-%m-%Y") 31.73224 33.22964 34.20407 34.88167 52.12422

strptime semble légèrement plus rapide. Alors, qu'est-ce qui se passe ? Pourquoi y a-t-il deux fonctions similaires ou y a-t-il des différences entre elles que j'ai manquées ?

169voto

Fhnuzoag Points 1034

Eh bien, les fonctions font des choses différentes.

Tout d'abord, il existe deux implémentations internes de la date/heure : POSIXct qui stocke les secondes depuis l'époque UNIX (+d'autres données), et POSIXlt qui stocke une liste de jour, mois, année, heure, minute, seconde, etc.

strptime est une fonction permettant de convertir directement les vecteurs de caractères (de différents formats) en POSIXlt format.

as.POSIXlt convertit une variété de types de données en POSIXlt . Il essaie d'être intelligent et de faire ce qui est raisonnable - dans le cas du caractère, il agit comme une enveloppe pour strptime .

as.POSIXct convertit une variété de types de données en POSIXct . Elle essaie également d'être intelligente et de faire ce qui est raisonnable - dans le cas du caractère, elle court strptime d'abord, puis effectue la conversion de POSIXlt a POSIXct .

Il est logique que strptime est plus rapide, car strptime ne gère que la saisie de caractères tandis que les autres essaient de déterminer la méthode à utiliser à partir du type de saisie. Cela devrait également être un peu plus sûr dans la mesure où si l'on reçoit des données inattendues, cela donnera simplement une erreur, au lieu d'essayer de faire la chose intelligente qui pourrait ne pas être ce que vous voulez.

29voto

kuong Points 391

Il existe deux types de POSIXt, POSIXct et POSIXlt. "ct" peut représenter le temps calendaire, il stocke le nombre de secondes depuis l'origine. "lt", ou heure locale, conserve la date sous la forme d'une liste d'attributs de temps (tels que "hour" et "mon"). Essayez ces exemples :

date.hour=strptime("2011-03-27 01:30:00", "%Y-%m-%d %H:%M:%S")

date=c("26/10/2016")

time=c("19:51:30")

day<-paste(date,"T", time)

day.time1=as.POSIXct(day,format="%d/%m/%Y T %H:%M:%S",tz="Europe/Paris")

day.time1

day.time1$year

day.time2=as.POSIXlt(day,format="%d/%m/%Y T %H:%M:%S",tz="Europe/Paris")

day.time2

day.time2$year

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X