J'ai suivi un certain nombre de questions ici qui demandent comment convertir des vecteurs de caractères en classes datetime. Je vois souvent 2 méthodes, le strptime et les méthodes as.POSIXct/as.POSIXlt. J'ai regardé les 2 fonctions mais je ne sais pas quelle est la différence.
function (x, format, tz = "")
{
y <- .Internal(strptime(as.character(x), format, tz))
names(y$year) <- names(x)
y
}
<bytecode: 0x045fcea8>
<environment: namespace:base>
function (x, tz = "", ...)
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>
function (x, tz = "", ...)
UseMethod("as.POSIXlt")
<bytecode: 0x03ac029c>
<environment: namespace:base>
Faire un micro-benchmark 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. alors qu'est-ce qui donne? Pourquoi y aurait-il 2 fonctions similaires ou y a-t-il des différences entre elles que j'ai manquées?
Les fonctions font des choses différentes.
Tout d’abord, il existe deux implémentations internes de date/heure: POSIXct
, qui stocke les secondes depuis UNIX Epoch (+ quelques autres données), et POSIXlt
, qui stocke une liste de jours, mois, années. , heure, minute, seconde, etc.
strptime
est une fonction permettant de convertir directement les vecteurs de caractères (de nombreux 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 le nécessaire - dans le cas d'un 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 le nécessaire - dans le cas d'un caractère, il lance 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 la saisie de caractères tandis que les autres tentent de déterminer la méthode à utiliser à partir du type d'entrée. Cela devrait également ê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 la chose intelligente qui pourrait ne pas être ce que vous voulez.
Il existe deux types POSIXt, POSIXct et POSIXlt. "ct" peut représenter l'heure du calendrier, il enregistre le nombre de secondes écoulées depuis l'origine. "lt", ou l'heure locale, conserve la date sous forme de liste d'attributs d'heure (tels que "heure" et "mois"). 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