R - обновить дату / время до 9 утра ближайшего рабочего дня в будущем
Столбец даты и времени моего фрейма данных имеет формат POSIXct, например, "2014-08-08 14:22:00".
Я хотел бы обновить такие значения даты и времени, если они выпадают из рабочего времени. Целевое значение должно быть ближайшим 9 утра в будний день в будущем. Это означает:
- Если текущее значение относится к раннему утру рабочего дня, обновите его до 9:00 того же дня;
- Если текущее значение указано после 17:00 до дня недели, обновите его до 9:00 следующего дня;
- Если текущее значение находится между 17:00 пятницы и 17:00 воскресенья, обновите его до 9:00 следующего понедельника.
Чтобы упростить дела, я не рассматриваю праздники. Все понедельники-пятницы с 9 до 17 часов считаются рабочими часами.
Есть предложения, как мне это сделать?
1 ответ
Решение
Здесь пользовательская функция, использующая lubridate
пакет (вы должны использовать его для такого рода вещей):
library(lubridate)
closeest_wday <-
function(tt){
if(!wday(tt) %in% c(1,7)){
if(hour(tt)<9) {
hour(tt)<- 9
minute(tt) <- 0
second(tt) <- 0
} else if (hour(tt)>=17) {
hour(tt)<- 9
minute(tt) <- 0
second(tt) <- 0
wday(tt) <- wday(tt) + 2
if(wday(tt) %in% c(1,7)) {
wday(tt) <- 2
}
}
}else{
wday(tt) <- wday(tt)+ ifelse(wday(tt)==1,1,2)
hour(tt)<- 9
minute(tt) <- 0
second(tt) <- 0
}
tt
}
Некоторые тесты, но я думаю, что вы должны продолжить с дополнительными тестами:
closeest_wday(as.POSIXct("2014-08-14 9:22:00")) ## weekday
[1] "2014-08-14 09:22:00 CEST"
> closeest_wday(as.POSIXct("2014-08-16 9:22:00")) ## friday
[1] "2014-08-18 09:00:00 CEST"
> closeest_wday(as.POSIXct("2014-08-17 10:22:00")) ## saturday
[1] "2014-08-18 09:00:00 CEST"
> closeest_wday(as.POSIXct("2014-08-15 17:22:00")) ## sunday
[1] "2014-08-18 09:00:00 CEST"