【问题标题】:Split time series data hourly in R在 R 中每小时拆分时间序列数据
【发布时间】:2017-06-05 12:22:01
【问题描述】:

我有以 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") #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

[[2]]
                        [,1]
2017-01-20 00:30:00 41.89185
2017-01-20 00:40:00 30.93997
2017-01-20 00:50:00 31.76651
2017-01-20 01:00:00 49.07364
2017-01-20 01:10:00 34.79113
2017-01-20 01:20:00 48.13881

预期输出是:

[[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 不能正常工作?

【问题讨论】:

  • 或者你使用基础split()lubridate::hour : split(df, lubridate::hour(timeind))。输出将是zoo 对象的列表。
  • 你也可以看看padr

标签: r time-series xts


【解决方案1】:

这是一个known bug。如果索引时区恰好不是一个与 UTC 相差一小时的时区,endpoints 将无法正常工作(因为它的计算基于 UTC)。

例如,亚洲/加尔各答是 UTC+0530,所以endpoints 对齐半小时。

一种可能的解决方法是在调用split 之前将索引添加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 })

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2012-04-09
    • 2018-03-10
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多