Как сгруппировать по времени для объекта XTS в R? - PullRequest
1 голос
/ 07 января 2020

У меня есть объект xts временного ряда в R.

По сути, продолжительность временного ряда составляет несколько месяцев, я хочу узнать тренд для разных временных точек.

Я хочу получить медиану или среднее значение для разных моментов времени.

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 ...

Спасибо за вашу помощь заранее!

Ответы [ 2 ]

1 голос
/ 07 января 2020

Этот однострочник использует 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 не использовался, поэтому это просто показывает, какой вывод выглядит как.

0 голосов
/ 07 января 2020

Один из способов - преобразовать временные ряды в фрейм данных и получить среднее значение по часам.

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)

data

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"
...