R - 将日期时间更新为将来最近工作日的上午9点

时间:2014-08-10 00:13:51

标签: r datetime posixct

我的数据框的日期时间列采用POSIXct格式,例如“2014-08-08 14:22:00”。

如果这些日期时间值超出工作时间,我想更新这些日期时间值。目标值需要是将来最接近工作日的上午9点。这意味着:

  • 如果当前值是在工作日的凌晨,请将其更新为当天上午9点;
  • 如果当前值是在工作日之前的下午5点之后,请将其更新为第二天上午9点;
  • 如果当前值在星期五下午5点到星期日下午5点之间,请将其更新为即将到来的星期一上午9点​​。

为了简化问题,我不考虑假期。周一至周五上午9点至下午5点被视为工作时间。

我应该怎么做?

1 个答案:

答案 0 :(得分:2)

这是一个使用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"