2017-01-20 4 views
2

Ich habe Zeitreihendaten bei 10 Minuten Rate abgetastet. Ich möchte es stundenweise teilen, aber zu meiner Überraschung produziert split.xts keine beabsichtigten Ergebnisse. Schritte verwendet werden:Split-Zeitreihendaten stündlich in R

library(xts) 
set.seed(123) 
Sys.setenv(TZ="Asia/Kolkata") 
timeind <- seq(as.POSIXct("2017-01-20 00:00:00 IST"), 
       as.POSIXct("2017-01-20 23:59:59 IST"),by="10 min") #for indexing 
df <- xts(runif(length(timeind),30,50),timeind) #xts data frame 
split(df,"hours",k=1) 

Ausgabe lautet:

[[1]] 
         [,1] 
2017-01-20 00:00:00 31.24343 
2017-01-20 00:10:00 32.57921 
2017-01-20 00:20:00 40.17684 

[[2]] 
         [,1] 
2017-01-20 00:30:00 41.89185 
2017-01-20 00:40:00 30.93997 
2017-01-20 00:50:00 31.76651 
2017-01-20 01:00:00 49.07364 
2017-01-20 01:10:00 34.79113 
2017-01-20 01:20:00 48.13881 

Erwartete Ausgabe lautet:

[[1]] 
         [,1] 
2017-01-20 00:00:00 31.24343 
2017-01-20 00:10:00 32.57921 
2017-01-20 00:20:00 40.17684 
2017-01-20 00:30:00 41.89185 
2017-01-20 00:40:00 30.93997 
2017-01-20 00:50:00 31.76651 

[[2]] 
2017-01-20 01:00:00 49.07364 
2017-01-20 01:10:00 34.79113 
2017-01-20 01:20:00 48.13881 
... 

Warum split.xts funktioniert nicht richtig?

+0

oder Sie verwenden base 'split()' mit 'lubridate :: hour':' split (df, lubridate :: hour (timeind)) '. Die Ausgabe wird jedoch eine Liste von "Zoo" -Objekten sein. – mtoto

+0

können Sie auch in 'padr' Paket suchen – Aramis7d

Antwort

2

Es ist ein known bug. Wenn es sich bei der Indexzeitzone nicht um eine Rundstundverschiebung von UTC handelt, funktioniert endpoints nicht korrekt (da ihre Berechnungen auf UTC basieren).

Zum Beispiel, Asien/Kolkata ist UTC + 0530, also endpoints richtet sich auf halbe Stunden.

Eine mögliche Problemumgehung wäre, dem Index vor dem Aufruf von split 30 Minuten hinzuzufügen und dann 30 Minuten von jedem Element des Ergebnisses abzuziehen. Dies kann jedoch zu Problemen bei der Sommerzeit führen, wenn die Zeitzone eines beobachtet.

df_adjusted <- df 
.index(df_adjusted) <- .index(df_adjusted) - 60 * 30 
by_hour <- lapply(split(df_adjusted, "hours"), 
      function(x) { .index(x) <- .index(x) + 60 * 30; x }) 
Verwandte Themen