Creación de series temporales regulares de 15 minutos a partir de series temporales irregulares

Tengo una serie temporal irregular (con DateTime y RainfallValue) en un archivo csv C:\SampleData.csv :

 DateTime,RainInches 1/6/2000 11:59,0 1/6/2000 23:59,0.01 1/7/2000 11:59,0 1/13/2000 23:59,0 1/14/2000 0:00,0 1/14/2000 23:59,0 4/14/2000 3:07,0.01 4/14/2000 3:12,0.03 4/14/2000 3:19,0.01 12/31/2001 22:44,0 12/31/2001 22:59,0.07 12/31/2001 23:14,0 12/31/2001 23:29,0 12/31/2001 23:44,0.01 12/31/2001 23:59,0.01 

Nota: los pasos de tiempo irregulares pueden ser de 1 minuto, 15 minutos, 1 hora, etc. Además, podría haber múltiples observaciones en un intervalo deseado de 15 minutos.

Intento crear una serie temporal regular de 15 minutos del 2000-01-01 al 2001-12-31 que debería verse así:

 2000-01-01 00:15:00 0.00 2000-01-01 00:30:00 0.00 2000-01-01 00:45:00 0.00 ... 2001-12-31 23:30:00 0.01 2001-12-31 23:45:00 0.01 

Nota: La serie temporal es regular con intervalos de 15 minutos, llenando los datos faltantes con 0. Si hay más de un punto de datos en intervalos de 15 minutos, se sumn.

Aquí está mi código:

 library(zoo) library(xts) filename = "C:\\SampleData.csv" ReadData <- read.zoo(filename, format = "%m/%d/%Y %H:%M", sep=",", tz="UTC", header=TRUE) # read .csv as a ZOO object RawData <- aggregate(ReadData, index(ReadData), sum) # Merge duplicate time stamps and SUM the corresponding data (CAUTION) RawDataSeries <- as.xts(RawData,order.by =index(RawData)) #convert to an XTS object RegularTimes <- seq(as.POSIXct("2000-01-01 00:00:00", tz = "UTC"), as.POSIXct("2001-12-31 23:45:00", tz = "UTC"), by = 60*15) BlankTimeSeries <- xts((rep(0,length(RegularTimes))),order.by = RegularTimes) MergedTimeSeries <- merge(RawDataSeries,BlankTimeSeries) TS_sum15min <- period.apply(MergedTimeSeries,endpoints(MergedTimeSeries, "minutes", 15), sum, na.rm = TRUE ) TS_align15min <- align.time( TS_sum15min [endpoints(TS_sum15min , "minutes", 15)], n=60*15) 

Problema: La serie de tiempo de salida TS_align15min : (a) tiene bloques repetitivos de sellos de tiempo (b) comienza (misteriosamente) desde 1999, como:

 1999-12-31 19:15:00 0 1999-12-31 19:30:00 0 1999-12-31 19:45:00 0 1999-12-31 20:00:00 0 1999-12-31 20:15:00 0 1999-12-31 20:30:00 0 

¿Qué estoy haciendo mal?

Gracias por cualquier dirección!

xts extiende zoológico, y el zoológico tiene ejemplos extensos para esto en sus viñetas y documentación.
Aquí hay un ejemplo trabajado. Creo que lo hice de forma más elegante en el pasado, pero esto es todo lo que se me ocurre ahora:

 R> twohours <- ISOdatetime(2012,05,02,9,0,0) + seq(0:7)*15*60 R> twohours [1] "2012-05-02 09:15:00 GMT" "2012-05-02 09:30:00 GMT" [3] "2012-05-02 09:45:00 GMT" "2012-05-02 10:00:00 GMT" [5] "2012-05-02 10:15:00 GMT" "2012-05-02 10:30:00 GMT" [7] "2012-05-02 10:45:00 GMT" "2012-05-02 11:00:00 GMT" R> set.seed(42) R> observation <- xts(1:10, order.by=twohours[1]+cumsum(runif(10)*60*10)) R> observation [,1] 2012-05-02 09:24:08.883625 1 2012-05-02 09:33:31.128874 2 2012-05-02 09:36:22.812594 3 2012-05-02 09:44:41.081170 4 2012-05-02 09:51:06.128481 5 2012-05-02 09:56:17.586051 6 2012-05-02 10:03:39.539040 7 2012-05-02 10:05:00.338998 8 2012-05-02 10:11:34.534372 9 2012-05-02 10:18:37.573243 10 

Una cuadrícula de tiempo de dos horas y algunas observaciones aleatorias que dejan algunas celdas vacías y otras llenas.

 R> to.minutes15(observation)[,4] observation.Close 2012-05-02 09:24:08.883625 1 2012-05-02 09:44:41.081170 4 2012-05-02 09:56:17.586051 6 2012-05-02 10:11:34.534372 9 2012-05-02 10:18:37.573243 10 

Eso es una agregación de cuadrícula de 15 minutos, pero no en nuestra grilla de tiempo.

 R> twoh <- xts(rep(NA,8), order.by=twohours) R> twoh [,1] 2012-05-02 09:15:00 NA 2012-05-02 09:30:00 NA 2012-05-02 09:45:00 NA 2012-05-02 10:00:00 NA 2012-05-02 10:15:00 NA 2012-05-02 10:30:00 NA 2012-05-02 10:45:00 NA 2012-05-02 11:00:00 NA R> merge(twoh, observation) twoh observation 2012-05-02 09:15:00.000000 NA NA 2012-05-02 09:24:08.883625 NA 1 2012-05-02 09:30:00.000000 NA NA 2012-05-02 09:33:31.128874 NA 2 2012-05-02 09:36:22.812594 NA 3 2012-05-02 09:44:41.081170 NA 4 2012-05-02 09:45:00.000000 NA NA 2012-05-02 09:51:06.128481 NA 5 2012-05-02 09:56:17.586051 NA 6 2012-05-02 10:00:00.000000 NA NA 2012-05-02 10:03:39.539040 NA 7 2012-05-02 10:05:00.338998 NA 8 2012-05-02 10:11:34.534372 NA 9 2012-05-02 10:15:00.000000 NA NA 2012-05-02 10:18:37.573243 NA 10 2012-05-02 10:30:00.000000 NA NA 2012-05-02 10:45:00.000000 NA NA 2012-05-02 11:00:00.000000 NA NA 

Nuevo objeto xts y objeto fusionado. Ahora usa na.locf() para llevar adelante las observaciones:

 R> na.locf(merge(twoh, observation)[,2]) observation 2012-05-02 09:15:00.000000 NA 2012-05-02 09:24:08.883625 1 2012-05-02 09:30:00.000000 1 2012-05-02 09:33:31.128874 2 2012-05-02 09:36:22.812594 3 2012-05-02 09:44:41.081170 4 2012-05-02 09:45:00.000000 4 2012-05-02 09:51:06.128481 5 2012-05-02 09:56:17.586051 6 2012-05-02 10:00:00.000000 6 2012-05-02 10:03:39.539040 7 2012-05-02 10:05:00.338998 8 2012-05-02 10:11:34.534372 9 2012-05-02 10:15:00.000000 9 2012-05-02 10:18:37.573243 10 2012-05-02 10:30:00.000000 10 2012-05-02 10:45:00.000000 10 2012-05-02 11:00:00.000000 10 

Y luego podemos fusionar nuevamente como una unión interna en la cuadrícula de tiempo x twoh :

 R> merge(twoh, na.locf(merge(twoh, observation)[,2]), join="inner")[,2] observation 2012-05-02 09:15:00 NA 2012-05-02 09:30:00 1 2012-05-02 09:45:00 4 2012-05-02 10:00:00 6 2012-05-02 10:15:00 9 2012-05-02 10:30:00 10 2012-05-02 10:45:00 10 2012-05-02 11:00:00 10 R> 

Aquí hay una solución data.table, esto se puede hacer con una combinación rolling:

 library(data.table) library(xts) lu <- data.table(index=as.POSIXct("2012-05-02") + (0:7)*15*60) observation <- xts(1:10, order.by=lu[1,index +cumsum(runif(10)*60*10)]) observation.dt <- as.data.table(observation) observation.dt[lu,on="index",roll=T]