2012-05-03 20 views
7

Tengo una serie de tiempo irregulares (con fecha y hora y RainfallValue) en un archivo csv C:\SampleData.csv:Creación de series de tiempo regular de 15 minutos a partir de las series de tiempo irregulares


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: El tiempo- irregulares los pasos podrían ser de 1 minuto, 15 minutos, 1 hora, etc. Además, podría haber múltiples observaciones en un intervalo deseado de 15 minutos.

Estoy tratando de crear un tiempo-serie regular de 15 minutos desde el 2000-01-01 a 2001-12-31 que debe verse como:


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: El de series de tiempo 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 suman.

He aquí es 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: El tiempo de salida de la serie TS_align15min: (a) se repiten bloques de sellos de tiempo (b) comience (misteriosamente) a partir de 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 

What am I doing wrong?

Thank you for any direction!

+1

generar algo de código reproducible para nosotros, dput () es útil. También declare el uso de paquetes contribuidos con la biblioteca o requiera. – mdsumner

+0

@mdsumner Gracias por su sugerencia. He agregado datos de muestra reproducibles y el código. – akashwani

+0

No, si depende de un archivo de datos que no tenemos, no es reproducible. Ver mi respuesta para _dandom data_ con una semilla dada - que la hace reproducible. –

Respuesta

15

xts extends zoo, and zoo has extensive examples for this in its vignettes and documentation.
Here is a worked example. I think I have done that more elegantly in the past, but this is all I am coming up with now:

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 

A two hour time grid, and some random observations leaving some cells empty and some filled.

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 

That is a 15 minutes grid aggregation but not on our time grid.

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 

New xts object, and merged object. Now use 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 combinar de nuevo como una combinación interna en el tiempo de conexión a la red XTS 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> 
+0

¡Gracias! Se ve bien. Déjame convertir mi código para seguir esto y regresar. También cambié mi publicación original para incluir código reproducible y datos de muestra. – akashwani

+5

Respecto a la elegancia: no necesita el objeto 'twoh'. Puede fusionar 'observación' con un objeto xts" vacío "(' xts (, twohours) '), usar' na.locf' en eso, luego subconjunto con 'twohours'. O bien, en una línea: 'na.locf (fusión (xts (, dos horas), observación)) [dos horas]'. –

+0

Hice el subconjunto de esa manera también (usando 'index (twoh)', pero terminó con errores con me perplejo. Es bueno ver que estaba en el camino correcto ... –

3

Aquí es una solución data.table, esto se puede perfectamente hacerse utilizando un balanceo de Ingreso:

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] 
Cuestiones relacionadas