在 R 中每周拆分时间序列

Split time-series weekly in R

我想在 R 中每周拆分 xts/zoo 时间序列。时区设置为 "Asia/Kolkata"

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)

split 的问题是每周数据偏移 5:30 小时,如下所示

> 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

我知道这是由于时区的原因(Asia/Kolkata 为 5:30 小时)。我也相信这可以通过使用 endpoints 函数来调整,但我发现它很难修复。谁能指点一下?

因此,如果我理解正确的话,您想要的输出是一个 xts 列表,其中每个元素都有一周的数据。 你可以这样做:

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]
})

您的代码非常好,您只需在上面代码的第 3 行添加一个时区参数("UTC" 或“GMT”,等同于此),而无需更改时区环境变量,如果您忘记重置变量,这总是很危险的。不需要从 dfxts 等的转换

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

如果您当前的时区不是“UTC”,您将收到一条警告,让您了解这一事实。