2011-09-27 14 views
9

Ho una serie storica irregolare (xts in R) a cui voglio applicare una finestra temporale. Ad esempio, dato una serie storica come il seguente, voglio calcolare le cose come il numero osservazioni ci sono in ogni finestra discreta di 3 ore, a partire dalle 2009-09-22 00:00:00:Analisi regolari su serie temporali irregolari

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"))) 

che a quanto pare non posso usare period.apply() o split() per farlo, perché quelli ometteranno i periodi senza osservazioni e non posso dargli un tempo di inizio.

mio output desiderato per il semplice problema di conteggio (anche se, naturalmente, i miei veri compiti sono più complicate con ogni segmento!) Sarebbe qualcosa di simile se aggregati 3 giorni alla volta:

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 

Grazie per qualsiasi consiglio.

risposta

11

Utilizzare align.time per inserire l'indice di s nei periodi che ti interessano. Quindi utilizzare period.apply per trovare la lunghezza di ciascuna finestra di 3 ore. Quindi uniscilo con un oggetto xts vuoto che ha tutti i valori di indice che desideri.

# 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

Questo non fa quello che sto cercando - lasciatemi aggiungere ulteriori dettagli alla domanda originale. –

+0

Forse l'idea di 'merge()' è ciò che mi serve comunque - per creare una sequenza con i miei endpoint di intervallo desiderati, quindi unirli alla sequenza? –

+0

@KenWilliams: sei sulla strada giusta. Ho aggiornato la mia risposta ... –

Problemi correlati