首页 文章

每周在R中分割时间序列

提问于
浏览
0

我想每周在 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

我知道这是由于时区(亚洲/加尔各答的5:30) . 我也相信这可以通过使用 endpoints 函数来调整,但我觉得难以修复 . 任何人都可以提供一些指示吗?

2 回答

  • 1

    因此,如果我理解正确,您所需的输出是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]
    })
    
  • 1

    你的代码非常好,你只需要在你上面的代码中的第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”,您将收到警告,让您意识到这一事实 .

相关问题