Это, по сути, join
операции, и могут помочь несколько пакетов R.Мне очень нравится data.table
за это.
Создайте свою таблицу
R> dt <- data.table(myhour=seq(from = as.POSIXct("2018-01-05 0:00", tz = "UTC"),
+ to = as.POSIXct("2018-01-13 23:00", tz = "UTC"),
+ by = "hour"))
R> dt[, weekday := wday(myhour)]
R> dt[]
myhour weekday
1: 2018-01-05 00:00:00 6
2: 2018-01-05 01:00:00 6
3: 2018-01-05 02:00:00 6
4: 2018-01-05 03:00:00 6
5: 2018-01-05 04:00:00 6
---
212: 2018-01-13 19:00:00 7
213: 2018-01-13 20:00:00 7
214: 2018-01-13 21:00:00 7
215: 2018-01-13 22:00:00 7
216: 2018-01-13 23:00:00 7
R>
Это, по сути, то, что вы имели, но как data.table
, используя свою вспомогательную функцию wday()
который может работать на Date
или POSIXt
.
Создайте свой отпуск
R> myholidays <- as.Date(c("2018-01-06", "2018-01-09")) # no UTC conversion
Примерно то же самое, но мы сохраняем его как Date
, поскольку они являются объектами даты.
Объединение
R> dt[, isholiday:=FALSE][as.Date(myhour) %in% myholidays, isholiday:=TRUE][]
myhour weekday isholiday
1: 2018-01-05 00:00:00 6 FALSE
2: 2018-01-05 01:00:00 6 FALSE
3: 2018-01-05 02:00:00 6 FALSE
4: 2018-01-05 03:00:00 6 FALSE
5: 2018-01-05 04:00:00 6 FALSE
---
212: 2018-01-13 19:00:00 7 FALSE
213: 2018-01-13 20:00:00 7 FALSE
214: 2018-01-13 21:00:00 7 FALSE
215: 2018-01-13 22:00:00 7 FALSE
216: 2018-01-13 23:00:00 7 FALSE
Это ключ, и мы объединяем три data.table
операции.Сначала мы создаем isholiday
как логическое значение по умолчанию FALSE
.Мы установили его для дат в нашем векторе праздников - преобразование из POSIXct
в Date
происходит на лету.Наконец, мы печатаем результат.
Проверка
R> head(dt[ isholiday==TRUE, ])
myhour weekday isholiday
1: 2018-01-06 00:00:00 7 TRUE
2: 2018-01-06 01:00:00 7 TRUE
3: 2018-01-06 02:00:00 7 TRUE
4: 2018-01-06 03:00:00 7 TRUE
5: 2018-01-06 04:00:00 7 TRUE
6: 2018-01-06 05:00:00 7 TRUE
R> summary(dt)
myhour weekday isholiday
Min. :2018-01-05 00:00:00 Min. :1.00 Mode :logical
1st Qu.:2018-01-07 05:45:00 1st Qu.:3.00 FALSE:168
Median :2018-01-09 11:30:00 Median :5.00 TRUE :48
Mean :2018-01-09 11:30:00 Mean :4.56
3rd Qu.:2018-01-11 17:15:00 3rd Qu.:6.00
Max. :2018-01-13 23:00:00 Max. :7.00
R>
Никогда не повредит проверить.48 записей - это то, что мы ожидали за два дня почасовых данных.