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

94

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, la méthode strptime et la méthode as.POSIXct / as.POSIXlt. J'ai regardé les 2 fonctions mais je ne sais pas 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>

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

RJ-
la source
4
Si vous voulez voir quel code est appelé lors de l'appel as.POSIXctet as.POSIXltsur les vecteurs de caractères, regardez as.POSIXct.defaultet as.POSIXlt.character, respectivement.
Joshua Ulrich

Réponses:

154

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

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

strptimeest une fonction permettant de convertir directement des vecteurs de caractères (de divers formats) en POSIXltformat.

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

as.POSIXctconvertit une variété de types de données en POSIXct. Il essaie également d'être intelligent et de faire ce qui est sensible - dans le cas du caractère, il s'exécute d' strptimeabord, puis effectue la conversion de POSIXlten POSIXct.

Il est logique que ce strptimesoit plus rapide, car strptimene gère que la saisie de caractères tandis que les autres essaient de déterminer quelle méthode utiliser à partir du type d'entrée. Cela devrait également être un peu plus sûr en ce sens que 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.

Fhnuzoag
la source
très bonne réponse. Y a-t-il un consensus sur les meilleures pratiques pour compiler des données à des fins de modélisation ou de visualisation des données?
dre
22

Il existe deux types POSIXt, POSIXct et POSIXlt. "ct" peut représenter l'heure du calendrier, il stocke le nombre de secondes depuis l'origine. "lt", ou heure locale, conserve la date sous la forme d'une liste d'attributs d'heure (tels que "heure" et "lun"). 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
kuong
la source