Подмножество только рабочих дней из временного ряда - PullRequest
2 голосов
/ 06 октября 2019

Я хочу установить подмножество только рабочих дней из временного ряда taylor в пакете forecast.

help(taylor)
Half-hourly electricity demand in England and Wales from Monday 5 June 2000 to 
Sunday 27 August 2000. Discussed in Taylor (2003), and kindly provided by James
W Taylor. Units: Megawatts

, но время временного рядаэто не даты, это числа на основе 1, представляющие дни с начала серии:

time(head(taylor))  
Time Series:
Start = c(1, 1) 
End = c(1, 6) 
Frequency = 336 
[1] 1.000000 1.002976 1.005952 1.008929 1.011905 1.014881

как преобразовать их в даты, извлечь только образцы рабочих дней и создать новый временной ряд с частотой5*24*2 (вместо исходной частоты 7*24*2)?

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Возможно, вы захотите преобразовать временной ряд в xts -объект, чтобы упростить манипулирование данными. Например, мы можем извлечь рабочие дни из xts -объекта, используя .indexwkday:

library(xts)

## load data
data(taylor, package = "forecast")

## convert to xts
taylor_xts <- xts(
    x = taylor,
    order.by = seq(from = as.POSIXct("2000-06-05"), length = length(taylor), by = "30 min")
)

## extract weekdays
taylor_wk <- taylor_xts[.indexwday(taylor_xts) %in% 1:5]

head(taylor_wk); tail(taylor_wk)
#>                      [,1]
#> 2000-06-05 00:00:00 22262
#> 2000-06-05 00:30:00 21756
#> 2000-06-05 01:00:00 22247
#> 2000-06-05 01:30:00 22759
#> 2000-06-05 02:00:00 22549
#> 2000-06-05 02:30:00 22313
#>                      [,1]
#> 2000-08-25 21:00:00 33064
#> 2000-08-25 21:30:00 31953
#> 2000-08-25 22:00:00 30548
#> 2000-08-25 22:30:00 29236
#> 2000-08-25 23:00:00 27623
#> 2000-08-25 23:30:00 26063

Или, если вместо этого мы хотим извлечь только данные из рабочих часов (будние дни с 9:00 до 18:00):

## extract office hours
taylor_offh <- taylor_xts[.indexwday(taylor_xts) %in% 1:5 & .indexhour(taylor_xts) >= 9 & .indexhour(taylor_xts) < 18]

head(taylor_offh); tail(taylor_offh)
#>                      [,1]
#> 2000-06-05 09:00:00 36834
#> 2000-06-05 09:30:00 37296
#> 2000-06-05 10:00:00 37338
#> 2000-06-05 10:30:00 37608
#> 2000-06-05 11:00:00 37692
#> 2000-06-05 11:30:00 37944
#>                      [,1]
#> 2000-08-25 15:00:00 35067
#> 2000-08-25 15:30:00 34928
#> 2000-08-25 16:00:00 34738
#> 2000-08-25 16:30:00 35004
#> 2000-08-25 17:00:00 34748
#> 2000-08-25 17:30:00 34090

Примечание: построение временного ряда с частичной выборкой с помощью plot.xts отображает дату-время на оси x и, следовательно, включает разрывы в выходные дни (поскольку временной рядбольше не отбирается через регулярные промежутки времени). Чтобы отобразить данные в виде связанного ряда, используйте plot.default (или plot.ts после преобразования обратно в ts -объект).

## plot time-series along time
plot(taylor_wk)

## plot time-series along index 
plot.default(taylor_wk, type = "l")    ## equivalently `plot(coredata(taylor_wk), type = "l")`

1 голос
/ 06 октября 2019

Мы могли бы создать "получасовую" последовательность дат с начальной и конечной датами, приведенными в описании taylor.

data("taylor", package="forecast")

dates <- seq(as.POSIXct("2000-06-05"), as.POSIXct("2000-08-28"), "30 min")
dates <- dates[-length(dates)]  # exclude "2000-08-28 00:00:00"

Теперь, используя substr(), мы можем исключить weekdays(), начинающийся с "S" (может не работать на других языках), и создать новый объект "ts" с определенным началом, концом,значения частоты.

taylor2 <- ts(taylor[!substr(weekdays(dates), 1, 1) == "S"], start=1, end=12, frequency=240)

Однако лучше создать объект "msts" с использованием библиотеки forecast для сохранения той же сезонности.

library(forecast)
taylor3 <- msts(taylor[!substr(weekdays(dates), 1, 1) == "S"], seasonal.periods=c(24*2, 24*2*5))

check

op <- par(mfrow=c(3, 1))
plot(taylor)
plot(taylor2)
plot(taylor3)
par(op)

enter image description here

...