2016-05-11 14 views
0

Ich möchte xts/zoo Zeitreihe in R auf wöchentlicher Basis teilen. Die Zeitzone ist auf „Asia/Kolkata“Split-Zeitreihe wöchentlich in R

Sys.setenv(TZ="Asia/Kolkata") 
library(xts) 
seqs<- seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-01-30"), by = "30 mins") 
ob<- xts(data.frame(value=1:(length(seqs))),seqs) 
weekdata <- split(ob,f="weeks",k=1) 

Das Problem bei diesen split ist, dass jede Woche Daten von 5.30 Stunden versetzt ist, wie unten

> head(weekdata[[2]],2) 
        value 
2016-01-04 05:30:00 156 
2016-01-04 06:00:00 157 
> head(weekdata[[3]],2) 
        value 
2016-01-11 05:30:00 492 
2016-01-11 06:00:00 493 

gezeigt Ich weiß, es ist wegen Zeitzone (5:30 Stunden für Asien/Kolkata). Ich glaube auch, dass dies mit der Funktion endpoints eingestellt werden kann, aber ich finde es schwierig zu beheben. Kann mir jemand Hinweise geben?

Antwort

1

Also, wenn ich richtig verstehe, ist Ihre gewünschte Ausgabe eine Liste von XTS, wo jedes Element Daten für eine Woche hat. Das können Sie mit diesem:

Sys.setenv(TZ="Asia/Kolkata") 
library(xts) 
library(lubridate) 
seqs = seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-01-30"), by = "30 mins") 
weeks <- week(seqs) 
df <- data.frame(seqs, weeks) 
ob <- xts(data.frame(value=1:(length(seqs))), seqs) 
weekdata = lapply(unique(weeks), function(i){ 
    ob[weeks == i] 
}) 
1

Ihr Code ist völlig in Ordnung, müssen Sie nur eine Zeitzone Parameter hinzufügen („UTC“ oder „GMT“, das entspricht) auf der 3. Zeile im Code oben und Sie müssen die Umgebungsvariable für die Zeitzone nicht ändern, was immer gefährlich ist, falls Sie vergessen, die Variable zurückzusetzen. Keine Notwendigkeit für Konvertierungen von df zu xts usw.

seqs<- seq(as.POSIXct("2016-01-01 00:00:00","UTC"),as.POSIXct("2016-01-30 00:00:00","UTC"), by = "30 mins”) 

> both(weekdata[[2]]) 

        value 
2016-01-04 00:00:00 145 
2016-01-04 00:30:00 146 
2016-01-04 01:00:00 147 
        value 
2016-01-10 22:30:00 478 
2016-01-10 23:00:00 479 
2016-01-10 23:30:00 480 

Falls Ihre aktuelle Zeitzone ist nicht „UTC“ erhalten Sie eine Warnung erhalten, dass Sie sich dieser Tatsache bewusst.