Differenza tra as.POSIXct / as.POSIXlt e strptime per convertire i vettori di caratteri in POSIXct / POSIXlt

Ho seguito un numero di domande qui che chiede come convertire i vettori di caratteri in classi datetime. Vedo spesso 2 metodi, il metodo strictime e as.POSIXct / as.POSIXlt. Ho guardato le 2 funzioni, ma non sono chiaro quale sia la differenza.

strptime

function (x, format, tz = "") { y <- .Internal(strptime(as.character(x), format, tz)) names(y$year) <- names(x) y }   

as.POSIXct

 function (x, tz = "", ...) UseMethod("as.POSIXct")   

as.POSIXlt

 function (x, tz = "", ...) UseMethod("as.POSIXlt")   

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 

il tempo sembra leggermente più veloce. quindi cosa dà? perché ci sarebbero 2 funzioni simili o ci sono differenze tra loro che mi sono perso?

Bene, le funzioni fanno cose diverse.

Innanzitutto, esistono due implementazioni interne di data / ora: POSIXct , che memorizza i secondi dall’epoca 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 formato POSIXlt .

as.POSIXlt converte una varietà di tipi di dati in POSIXlt . Cerca di essere intelligente e fa la cosa sensata – nel caso del personaggio, funge da involucro per il strptime .

as.POSIXct converte una varietà di tipi di dati in POSIXct . Cerca anche di essere intelligente e di fare la cosa sensata – nel caso del personaggio, esegue prima il periodo di strptime , quindi esegue la conversione da POSIXlt a POSIXct .

È strptime che il tempo di strptime sia più veloce, perché il tempo strptime limita a gestire l’input dei caratteri mentre gli altri cercano di determinare quale metodo utilizzare dal tipo di input. Dovrebbe anche essere un po ‘più sicuro in quanto dare dati inaspettati darebbe un errore, invece di cercare di fare la cosa intelligente che potrebbe non essere quello che vuoi.

Esistono due tipi POSIXt, POSIXct e POSIXlt. “ct” può resistere all’ora del calendario, memorizza il numero di secondi dall’origine. “lt”, o ora locale, mantiene la data come una lista di attributi temporali (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/%YT %H:%M:%S",tz="Europe/Paris") day.time1 day.time1$year day.time2=as.POSIXlt(day,format="%d/%m/%YT %H:%M:%S",tz="Europe/Paris") day.time2 day.time2$year