Rudimentos para la manipulación de fechas con R
Puede que a alguien le resulte sencillo, pero jamás ameno: trabajar con fechas y horas es, cuando menos, una molestia con cualquier lenguaje de programación. Y como mi compañero Raúl ofreció en su bitácora una pequeña guía de cómo operar con ellas usando SAS/WPS, me dispongo yo a hacer lo propio con R.
Leyendo fechas y horas: strptime
El primer encontronazo con el insidioso problema de las fechas y las horas suele ser el tener que leerlas de algún fichero de texto. En tales casos la función strptime siempre es útil:
a <- c( "11NOV2008:03:15:00", "11NOV2009:23:15:00", "11NOV2010:03:15:00" )
b <- strptime( a, "%d%b%Y:%H:%M:%S" )
Lo único tedioso en la conversión es crear el patrón de representación de la fecha mediante indicadores de formato tales como %d (día del mes), %H (hora del día (0-23)), etc. Por ejemplo,
a <- c( "11NOV2008hola03:15:00", "11NOV2009hola23:15:00", "11NOV2010hola03:15:00" )
b <- strptime( a, "%d%b%Yhola%H:%M:%S" )
La lista de los distintos indicadores de formato puede consultarse en la página de ayuda de strptime.
Merece la pena familiarizarse con los más habituales: %H, %M, %S, %y, %Y, %d, %m, etc.
Objetos fecha-hora: POSIXct, POSIXlt (y POSIXt)
Si uno hace
class( b )
verá que éste es un vector de objetos de las clases POSIXlt y POSIXt. Existe una clase más, POSIXct para representar información de tipo fecha-hora.
¿Por qué tres clases distintas para el mismo tipo de información? POSIXlt y POSIXct se diferencian esencialmente en la manera de representar internamente la información:
b.1 <- b[1]
is.list( b.1 ) # TRUE
do.call( c, b[1] )
b.2 <- as.POSIXct( b.1 )
is.list( b.2 ) # FALSE
unclass( b.2 )
Las funciones as.POSIXct y as.POSIXlt permiten pasar de una representación a otra. La primera es más conveniente para su uso en vectores, etc., mientras que la segunda, más próxima a la representación legible de los objetos fecha-hora (y, probablemente, mucho más ineficiente) debería utilizarse en las proximidades de la interfaz.
¿Y POSIXt? Pues se trata de una clase virtual que extienden tanto POSIXct como POSIXlt y que permite realizar operaciones entre objetos de las dos clases como si fuesen de la misma.
Operando con objetos POSIXt: difftime
Las operaciones más típicas con objetos de tipo fecha-hora son las diferencias e incrementos. Si restamos dos objetos de la clase POSIXt, se obtiene uno de la clase difftime.
mi.delta <- b[2] - b[1]
class( mi.delta )
También se pueden crear usando as.difftime
a.1 <- as.difftime( 23, units = "hours" )
a.2 <- as.difftime( 23, units = "secs" )
Y sumárselos/restárselos a un objeto fecha-hora:
b.1 - a.1
b.2 + a.2
No obstante, ¡hay que tener cuidado al operar con ellos! Por ejemplo,
mean( c( a.1, a.2 ) )
da un resultado que uno no sabe a primera vista qué significa (y eso no es bueno).