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?
r
date
time
benchmarking
RJ-
la source
la source
as.POSIXct
etas.POSIXlt
sur les vecteurs de caractères, regardezas.POSIXct.default
etas.POSIXlt.character
, respectivement.Réponses:
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), etPOSIXlt
, qui stocke une liste de jour, mois, année, heure, minute, seconde, etc.strptime
est une fonction permettant de convertir directement des vecteurs de caractères (de divers formats) enPOSIXlt
format.as.POSIXlt
convertit une variété de types de données enPOSIXlt
. Il essaie d'être intelligent et de faire ce qui est sensible - dans le cas du caractère, il agit comme un wrapperstrptime
.as.POSIXct
convertit une variété de types de données enPOSIXct
. Il essaie également d'être intelligent et de faire ce qui est sensible - dans le cas du caractère, il s'exécute d'strptime
abord, puis effectue la conversion dePOSIXlt
enPOSIXct
.Il est logique que ce
strptime
soit plus rapide, carstrptime
ne 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.la source
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:
la source