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í?
r
date
time
benchmarking
RJ-
fuente
fuente
as.POSIXct
yas.POSIXlt
en los vectores de caracteres, mireas.POSIXct.default
yas.POSIXlt.character
, respectivamente.Respuestas:
Bueno, las funciones hacen cosas diferentes.
Primero, hay dos implementaciones internas de fecha / hora:,
POSIXct
que almacena segundos desde la época de UNIX (+ algunos otros datos), yPOSIXlt
, que almacena una lista de día, mes, año, hora, minuto, segundo, etc.strptime
es una función para convertir directamente vectores de caracteres (de una variedad de formatos) aPOSIXlt
formato.as.POSIXlt
convierte una variedad de tipos de datos aPOSIXlt
. Intenta ser inteligente y hacer lo sensato; en el caso del personaje, actúa como un envoltorio parastrptime
.as.POSIXct
convierte una variedad de tipos de datos aPOSIXct
. También intenta ser inteligente y hacer lo sensato: en el caso del personaje, se ejecutastrptime
primero y luego realiza la conversión dePOSIXlt
aPOSIXct
.Tiene sentido que
strptime
sea más rápido, porquestrptime
solo 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.fuente
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:
fuente