R - обновить datetime до 9 утра ближайшего рабочего дня в будущем

Столбец datetime моего фрейма данных находится в формате POSIXct, например. «2014-08-08 14:22:00».

Я хотел бы обновить такие значения даты и времени, если они выпадают из рабочего времени. Целевое значение должно быть ближайшим 9 утра буднего дня в будущем. Это означает:

  • Если текущее значение приходится на раннее утро рабочего дня, обновите его до 9 утра того же дня;
  • Если текущее значение после 17:00 до рабочего дня, обновите его до 9:00 следующего дня;
  • Если текущее значение находится между 17:00 пятницы и 17:00 воскресенья, обновите его до 9:00 следующего понедельника.

Чтобы упростить ситуацию, я не рассматриваю праздники. Рабочими часами считаются понедельник-пятница с 9:00 до 17:00.

Есть предложения, как мне это сделать?


person MichM    schedule 10.08.2014    source источник


Ответы (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"
person agstudy    schedule 10.08.2014
comment
Я внес небольшие правки. closeest_wday <- function(tt){ if(!wday(tt) %in% c(1,7)){ #lubridate sunday is 1 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) + 1 if(wday(tt) %in% c(1,7)) { wday(tt) <- wday(tt)+2 } } }else{ wday(tt) <- wday(tt)+ ifelse(wday(tt)==1,1,2) hour(tt)<- 9 minute(tt) <- 0 second(tt) <- 0 } tt } - person MichM; 12.08.2014