106 votes

Différence entre as.POSIXct/as.POSIXlt et strptime pour convertir 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 date et d'heure. Je vois souvent 2 méthodes, les méthodes strptime et les méthodes as.POSIXct/as.POSIXlt. J'ai regardé les 2 fonctions mais je ne suis pas sûr de la différence.

strptime

function (x, format, tz = "") 
{
    y <- .Internal(strptime(as.character(x), format, tz))
    names(y$year) <- names(x)
    y
}

as.POSIXct

function (x, tz = "", ...) 
UseMethod("as.POSIXct")

as.POSIXlt

function (x, tz = "", ...) 
UseMethod("as.POSIXlt")

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

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. donc qu'en est-il? pourquoi y aurait-il 2 fonctions similaires ou y a-t-il des différences entre eux que j'aurais manquées?

169voto

Fhnuzoag Points 1034

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

Tout d'abord, il y a deux implémentations internes de 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 qui convertit directement des vecteurs de caractères (de différents formats) au format POSIXlt.

as.POSIXlt convertit une variété de types de données en POSIXlt. Il essaie d'être intelligent et de faire quelque chose de sensé - dans le cas du caractère, il agit comme un wrapper pour strptime.

as.POSIXct convertit une variété de types de données en POSIXct. Il essaie également d'être intelligent et de faire quelque chose de sensé - dans le cas du caractère, il exécute d'abord strptime, puis effectue la conversion de POSIXlt en POSIXct.

Il est logique que strptime soit plus rapide, car strptime ne gère que les entrées de caractères tandis que les autres essaient de déterminer la méthode à utiliser en fonction du type d'entrée. De plus, il devrait être un peu plus sûr car le fait de recevoir des données inattendues donnerait simplement une erreur, au lieu d'essayer de faire quelque chose d'intelligent qui pourrait ne pas être ce que vous voulez.

29voto

kuong Points 391

Il existe deux types POSIXt, POSIXct et POSIXlt. "ct" peut signifier time calendar, il stocke le nombre de secondes depuis l'origine. "lt", ou local time, conserve la date sous forme d'une liste d'attributs temporels (comme "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