我的数据框的日期时间列采用POSIXct格式,例如“2014-08-08 14:22:00”。
如果这些日期时间值超出工作时间,我想更新这些日期时间值。目标值需要是将来最接近工作日的上午9点。这意味着:
为了简化问题,我不考虑假期。周一至周五上午9点至下午5点被视为工作时间。
我应该怎么做?
答案 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"