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:

1
2
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,

1
2
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

1
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:

1
2
3
4
5
6
7
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.

1
2
mi.delta <- b[2] - b[1]
class( mi.delta )

También se pueden crear usando as.difftime

1
2
a.1 <- as.difftime( 23, units = "hours" )
a.2 <- as.difftime( 23, units = "secs" )

Y sumárselos/restárselos a un objeto fecha-hora:

1
2
b.1 - a.1
b.2 + a.2

No obstante, ¡hay que tener cuidado al operar con ellos! Por ejemplo,

1
mean( c( a.1, a.2 ) )

da un resultado que uno no sabe a primera vista qué significa (y eso no es bueno).