2012-05-03 8 views
7

mam nieregularny cykl czasowy (z DateTime i RainfallValue) w pliku csv C:\SampleData.csv:Tworzenie regularnych 15-minutowy limit czasu serię z nieregularnym szeregów czasowych


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 

Uwaga: Nieregularny czasowemu etapy mogą wynosić 1 minutę, 15 minut, 1 godzinę itd. Ponadto, może być wiele obserwacji w pożądanym 15-minutowym przedziale.

Próbuję utworzyć regularny 15-minutowy limit czasu serię od 2000-01-01 do 2001-12-31, który powinien wyglądać tak:


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 

Uwaga: Czas-seria regularne z 15-minutowymi przerwami, wypełniające brakujące dane przez 0. Jeśli istnieje więcej niż jeden punkt danych w odstępach 15-minutowych, są one sumowane.

Oto jest mój kod:


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) 

Problem: Czas wyświetlania serii TS_align15min: (a), powtarzalnych bloków czasowych znaczków (b) rozpoczyna (tajemniczy) od 1999 roku, jako:

 
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

wygenerować kod powtarzalne dla nas dput () jest przydatne. Zadeklaruj także użycie dostarczonych pakietów z biblioteką lub wymagaj. – mdsumner

+0

@mdsumner Dzięki za sugestię. Dodałem powtarzalne dane przykładowe i kod. – akashwani

+0

Nie, jeśli zależy to od pliku danych, którego nie mamy, nie jest odtwarzalny. Zobacz moją odpowiedź na _random data_ z danym nasieniem - co sprawia, że ​​jest powtarzalny. –

Odpowiedz

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() prowadzić obserwacje Forward:

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 

a potem możemy połączyć ponownie jako sprzężenia wewnętrznego na siatce czasu 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

Dziękujemy! Wygląda dobrze. Pozwól mi przekonwertować kod, aby to zrobić i wrócić. Zmieniłem również mój oryginalny wpis, aby zawierał odtwarzalny kod i przykładowe dane. – akashwani

+5

Jeśli chodzi o elegancję: nie potrzebujesz obiektu 'dwoch'. Możesz połączyć 'obserwację' z" pustym "obiektem xts (' xts (, dwie godziny) '), użyj' na.locf' na tym, następnie podzbiór z 'twohours'. Lub, w jednym wierszu: 'na.locf (scalanie (xts (, dwie godziny), obserwacja)) [dwie godziny]'. –

+0

Zrobiłem również podzbiór w ten sposób (używając 'indeksu (dwah)', ale skończyłem z błędami z zakłopotaniem.Najlepsze, że byłem na prawym trac ... –

3

Oto data.table rozwiązanie, można to zrobić za pomocą starannie toczenia dołączyć:

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] 
Powiązane problemy