Diferencia entre as.POSIXct / as.POSIXlt y strptime para convertir vectores de caracteres a POSIXct / POSIXlt

94

He seguido una serie de preguntas aquí sobre cómo convertir vectores de caracteres en clases de fecha y hora. A menudo veo 2 métodos, los métodos strptime y as.POSIXct / as.POSIXlt. Miré las 2 funciones pero no tengo claro cuál es la diferencia.

strptime

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

como.POSIXct

function (x, tz = "", ...) 
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>

como.POSIXlt

function (x, tz = "", ...) 
UseMethod("as.POSIXlt")
<bytecode: 0x03ac029c>
<environment: namespace:base>

Haciendo un microbenchmark para ver si hay diferencias de rendimiento:

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 parece un poco más rápido. entonces que da ¿Por qué habría 2 funciones similares o hay diferencias entre ellas que me perdí?

RJ-
fuente
4
Si desea ver qué código se llama al llamar as.POSIXcty as.POSIXlten los vectores de caracteres, mire as.POSIXct.defaulty as.POSIXlt.character, respectivamente.
Joshua Ulrich

Respuestas:

154

Bueno, las funciones hacen cosas diferentes.

Primero, hay dos implementaciones internas de fecha / hora:, POSIXctque almacena segundos desde la época de UNIX (+ algunos otros datos), y POSIXlt, que almacena una lista de día, mes, año, hora, minuto, segundo, etc.

strptimees una función para convertir directamente vectores de caracteres (de una variedad de formatos) a POSIXltformato.

as.POSIXltconvierte una variedad de tipos de datos a POSIXlt. Intenta ser inteligente y hacer lo sensato; en el caso del personaje, actúa como un envoltorio para strptime.

as.POSIXctconvierte una variedad de tipos de datos a POSIXct. También intenta ser inteligente y hacer lo sensato: en el caso del personaje, se ejecuta strptimeprimero y luego realiza la conversión de POSIXlta POSIXct.

Tiene sentido que strptimesea ​​más rápido, porque strptimesolo maneja la entrada de caracteres mientras que los otros intentan determinar qué método usar desde el tipo de entrada. También debería ser un poco más seguro, ya que recibir datos inesperados solo daría un error, en lugar de intentar hacer algo inteligente que podría no ser lo que desea.

Fhnuzoag
fuente
gran respuesta. ¿Existe un consenso sobre cuál es la mejor práctica para compilar datos con fines de modelado o visualización de datos?
dre
23

Hay dos tipos de POSIXt, POSIXct y POSIXlt. "ct" puede representar el tiempo del calendario, almacena el número de segundos desde el origen. "lt", u hora local, mantiene la fecha como una lista de atributos de hora (como "hora" y "lun"). Prueba estos ejemplos:

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
fuente