web-dev-qa-db-fra.com

Différence entre as.POSIXct / as.POSIXlt et strptime pour la conversion de 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 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.

temps de repos

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

comme.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 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?

85
RJ-

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.

144
Fhnuzoag

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
19
kuong