按小时拆分时间序列数据(单位:R)
我以10分钟的速率对时间序列数据进行采样。我想按小时进行拆分,但出乎意料的是,按小时拆分时间序列数据(单位:R),r,time-series,xts,R,Time Series,Xts,我以10分钟的速率对时间序列数据进行采样。我想按小时进行拆分,但出乎意料的是,split.xts并没有产生预期的结果。使用的步骤包括: 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") #f
split.xts
并没有产生预期的结果。使用的步骤包括:
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)
预期产出为:
[[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
...
为什么split.xts
工作不正常?这是一个问题。如果索引时区恰好不是UTC的整小时偏移量,端点
无法正常工作(因为其计算基于UTC)
例如,亚洲/加尔各答是UTC+0530,因此端点
在半小时内对齐
一种可能的解决方法是在调用拆分
之前在索引中添加30分钟,然后从结果的每个元素中减去30分钟。尽管这可能会引起夏令时的问题,但如果时区遵守夏令时的话
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 })
df\u已调整,或者使用basesplit()
和lubridate::hour
:split(df,lubridate::hour(timeind))
。输出将是zoo
对象的列表。您还可以查看padr
包
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 })