Differenza tra as.POSIXct / as.POSIXlt e strptime per la conversione di vettori di caratteri in POSIXct / POSIXlt


93

Ho seguito una serie di domande qui che chiedono come convertire i vettori di caratteri in classi datetime. Vedo spesso 2 metodi, i metodi strptime e as.POSIXct / as.POSIXlt. Ho esaminato le 2 funzioni ma non è chiaro quale sia la differenza.

strptime

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

come 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>

Fare un microbenchmark per vedere se ci sono differenze di prestazioni:

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 sembra leggermente più veloce. quindi cosa succede? perché ci sarebbero 2 funzioni simili o ci sono differenze tra loro che mi sono perse?


4
Se vuoi vedere quale codice viene chiamato durante la chiamata as.POSIXcte as.POSIXltsui vettori di caratteri, guarda as.POSIXct.defaulte as.POSIXlt.character, rispettivamente.
Joshua Ulrich

Risposte:


153

Ebbene, le funzioni fanno cose diverse.

Innanzitutto, ci sono due implementazioni interne di data / ora POSIXct:, che memorizza i secondi dall'epoca di UNIX (+ alcuni altri dati) e POSIXlt, che memorizza un elenco di giorno, mese, anno, ora, minuto, secondo, ecc.

strptimeè una funzione per convertire direttamente i vettori di caratteri (di una varietà di formati) in POSIXltformato.

as.POSIXltconverte una varietà di tipi di dati in POSIXlt. Cerca di essere intelligente e di fare la cosa sensata - nel caso del personaggio, funge da involucro strptime.

as.POSIXctconverte una varietà di tipi di dati in POSIXct. Cerca anche di essere intelligente e di fare la cosa sensata - nel caso del personaggio, strptimeprima corre , poi esegue la conversione da POSIXlta POSIXct.

Ha senso che strptimesia più veloce, perché strptimegestisce solo l'input di caratteri mentre gli altri cercano di determinare quale metodo usare dal tipo di input. Dovrebbe anche essere un po 'più sicuro in quanto ricevere dati inaspettati darebbe semplicemente un errore, invece di provare a fare la cosa intelligente che potrebbe non essere ciò che desideri.


Bella risposta. esiste un consenso su quale sia la migliore pratica per la compilazione dei dati per scopi di modellazione o visualizzazione dei dati?
dre

22

Esistono due tipi di POSIXt, POSIXct e POSIXlt. "ct" può rappresentare l'ora del calendario, memorizza il numero di secondi dall'origine. "lt", o ora locale, mantiene la data come un elenco di attributi di tempo (come "ora" e "mon"). Prova questi esempi:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.