r - 分解xts每小时时间序列

标签 r xts posixct

我想使用 decomposeetsSTL 或任何函数分解每小时时间序列。这是示例代码及其输出:

require(xts)
require(forecast)
time_index1 <- seq(from = as.POSIXct("2012-05-15 07:00"),
                   to = as.POSIXct("2012-05-17 18:00"), by="hour")
head(time_index1 <- format(time_index1, format="%Y-%m-%d %H:%M:%S",
                           tz="UTC", usetz=TRUE)
# [1] "2012-05-15 05:00:00 UTC" "2012-05-15 06:00:00 UTC"
# [3] "2012-05-15 07:00:00 UTC" "2012-05-15 08:00:00 UTC"
# [5] "2012-05-15 09:00:00 UTC" "2012-05-15 10:00:00 UTC"
head(time_index <- as.POSIXct(time_index1))
# [1] "2012-05-15 05:00:00 CEST" "2012-05-15 06:00:00 CEST"
# [3] "2012-05-15 07:00:00 CEST" "2012-05-15 08:00:00 CEST"
# [5] "2012-05-15 09:00:00 CEST" "2012-05-15 10:00:00 CEST"

为什么time_index的时区变回CEST?

set.seed(1)
value <- rnorm(n = length(time_index1))
eventdata1 <- xts(value, order.by = time_index)
tzone(eventdata1)
# [1] ""
head(index(eventdata1))
# [1] "2012-05-15 05:00:00 CEST" "2012-05-15 06:00:00 CEST"
# [3] "2012-05-15 07:00:00 CEST" "2012-05-15 08:00:00 CEST"
# [5] "2012-05-15 09:00:00 CEST" "2012-05-15 10:00:00 CEST"
ets(eventdata1)
# ETS(A,N,N) 
# 
# Call:
#  ets(y = eventdata1) 
# 
#   Smoothing parameters:
#     alpha = 1e-04 
# 
#   Initial states:
#     l = 0.1077 
# 
#   sigma:  0.8481
# 
#      AIC     AICc      BIC 
# 229.8835 230.0940 234.0722
decompose(eventdata1)
# Error in decompose(eventdata1) : 
#   time series has no or less than 2 periods
stl(eventdata1)
# Error in stl(eventdata1) : 
#   series is not periodic or has less than two periods

当我调用tzoneindexTZ时,没有时区,但index清楚地显示时间是用时区定义的。

另外,为什么只有 ets 有效?它可以用来分解时间序列吗?

最佳答案

Why does the timezone for time_index change back to CEST?

因为您在调用 as.POSIXct 时没有指定 tz=。如果时区是通过 UTC 偏移量指定的(例如 -0800),它只会从字符串中获取时区。请参阅?strptime

R> head(time_index <- as.POSIXct(time_index1, "UTC"))
[1] "2012-05-15 12:00:00 UTC" "2012-05-15 13:00:00 UTC"
[3] "2012-05-15 14:00:00 UTC" "2012-05-15 15:00:00 UTC"
[5] "2012-05-15 16:00:00 UTC" "2012-05-15 17:00:00 UTC"

When I call tzone or indexTZ there is no timezone but the index clearly show that the times are defined with a timezone.

所有 POSIXct 对象都有一个时区。时区 "" 只是意味着 R 无法确定特定时区,因此它使用操作系统指定的时区。请参阅?时区

只有 ets 函数可以工作,因为您的 xts 对象没有正确定义的 Frequency 属性。这是 xts 对象的一个​​已知限制,我计划在接下来的几个月内解决这些问题。您可以通过在调用 xts 构造函数后显式指定 Frequency 属性来解决当前问题。

R> set.seed(1)
R> value <- rnorm(n = length(time_index1))
R> eventdata1 <- xts(value, order.by = time_index)
R> attr(eventdata1, 'frequency') <- 24  # set frequency attribute
R> decompose(as.ts(eventdata1))  # decompose expects a 'ts' object

关于r - 分解xts每小时时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31583944/

相关文章:

r - 哪个是 'right' 与 R 中的 'left' 滚动平均值?

r - 两个 xts 时间序列的散点图

R:if_else 和时区强制

r - ggplot2 绘制日期数据的错误——缺少需要 TRUE/FALSE 的值

r - 按名称汇总数据,跨多个变量

r - 在循环中使用 data.table 优化子集

r - 更改运算符(operator)默认行为

r - 将 xts 转换为 ts : Error in Round(frequency)

R:循环遍历 csv 文件列表以更改日期格式并创建 XTS 对象

r - 如何将季度/月度数据转换为 POSIXct 或 Date