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"
Другие вопросы по тегам