在 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”,等同于此),而无需更改时区环境变量,如果您忘记重置变量,这总是很危险的。不需要从 df
到 xts
等的转换
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”,您将收到一条警告,让您了解这一事实。
我想在 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”,等同于此),而无需更改时区环境变量,如果您忘记重置变量,这总是很危险的。不需要从 df
到 xts
等的转换
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”,您将收到一条警告,让您了解这一事实。