如何按时间对 R 中的 XTS 对象进行分组?

How to group by time for XTS object in R?

我在 R 中有一个时间序列 xts 对象。

基本上时间序列持续时间是几个月,我想知道不同时间点的趋势。

我想获得不同时间点的中位数或均值。

library(xts)
library(lubridate)
Time <- seq(ymd_hms("2019-01-01 00:00:00"), ymd_hms("2019-03-29 23:59:59"), "hour")
length(Time)
Data <- rnorm(2112, 1, 5)
Time_Series <- xts(x = Data , order.by = Time)

以此代码为例

如何获得时间 00:00:00 的数据的平均值?同样,01:00:00、02:00:00、03:00:00 ...

中数据的平均值

提前感谢您的帮助!

一种方法是将时间序列转换为数据帧并按小时计算平均值。

library(dplyr)
library(lubridate)

Time_Series %>%
  zoo::fortify.zoo() %>%
  group_by(hour = hour(Index)) %>%
  summarise(mn = mean(Data))

# A tibble: 24 x 2
#    hour     mn
#   <int>  <dbl>
# 1     0  1.53 
# 2     1  0.414
# 3     2  1.24 
# 4     3  1.07 
# 5     4  1.32 
# 6     5  1.34 
# 7     6  0.998
# 8     7 -0.615
# 9     8  0.924
#10     9  0.484
# … with 14 more rows

基数为 R 的方法将使用 aggregate

df <- zoo::fortify.zoo(Time_Series)
df$hour <- format(df$Index, "%H")
aggregate(Data~hour, df, mean)

数据

set.seed(23)
Time <- seq(ymd_hms("2019-01-01 00:00:00"), ymd_hms("2019-03-29 23:59:59"), "hour")
Data <- rnorm(2112, 1, 5)
Time_Series <- xts(x = Data , order.by = Time)
names(Time_Series) <- "Data"

这个单行代码使用 aggregate.zoo 生成一个时间为整点的动物园对象。没有使用额外的包。

aggregate(Time_Series, hour, mean)

给予:

0  0.4237426
1  1.8814963
2  1.2917437
3  1.4307028
4  1.3691019
5  0.3762082
6  1.3866948
# ...snip...

请注意,问题中的数据不可重现,因为未使用 set.seed,所以这只是显示输出的样子。