2011-09-27 12 views
9

Tengo una serie de tiempo irregular (xts en R) a la que deseo aplicar algunas ventanas de tiempo. Por ejemplo, dada una serie de tiempo como el siguiente, quiero calcular cosas como el número de observaciones que hay en cada ventana discreta de 3 horas, a partir de 2009-09-22 00:00:00:Análisis regular sobre series de tiempo irregulares

library(lubridate) 
s <- xts(c("OK", "Fail", "Service", "OK", "Service", "OK"), 
     ymd_hms(c("2009-09-22 07:43:30", "2009-10-01 03:50:30", 
        "2009-10-01 08:45:00", "2009-10-01 09:48:15", 
        "2009-11-11 10:30:30", "2009-11-11 11:12:45"))) 

que al parecer no puedo usar period.apply() o split() para hacerlo, porque esos omitirán períodos sin observaciones, y no puedo darle una hora de inicio.

Mi salida deseada por el simple problema de conteo (aunque, por supuesto, mis tareas reales son más complicadas con cada segmento!) Sería algo como esto si agregados 3 días a la vez:

2009-09-22 1 
2009-09-25 0 
2009-09-28 0 
2009-10-01 3 
2009-10-04 0 
2009-10-07 0 
2009-10-10 0 
2009-10-13 0 
2009-10-16 0 
2009-10-19 0 
2009-10-22 0 
2009-10-25 0 
2009-10-28 0 
2009-10-31 0 
2009-11-03 0 
2009-11-06 0 
2009-11-09 2 

Gracias por cualquier orientación.

Respuesta

11

Utilice align.time para poner el índice de s en los períodos que le interesen. Luego, use period.apply para encontrar la longitud de cada ventana de 3 horas. Luego, combínalo con un objeto xts vacío que tenga todos los valores de índice que quieras.

# align index into 3-hour blocks 
a <- align.time(s, n=60*60*3) 
# find the number of obs in each block 
count <- period.apply(a, endpoints(a, "hours", 3), length) 
# create an empty xts object with the desired index 
e <- xts(,seq(start(a),end(a),by="3 hours")) 
# merge the counts with the empty object and fill with zeros 
out <- merge(e,count,fill=0) 
+0

Eso no hace lo que estoy buscando, permítame agregar más detalles a la pregunta original. –

+0

Quizás la idea de 'merge()' es lo que necesito: ¿crear una secuencia con mis puntos finales de intervalo deseados, luego unir eso a la secuencia? –

+0

@KenWilliams: estás en el camino correcto. He actualizado mi respuesta ... –

Cuestiones relacionadas