我有一长串某个程序的开始日期.规则要求程序最多在6个工作日内完成.我希望计算截止日期.
在R中使用lubridate,我可以获得六天的截止日期
> library(lubridate)
> date.in <- dmy(c("30-8-2001", "12-1-2003", "28-2-2003", "20-5-2004"))
> date.in
[1] "2001-08-30 UTC" "2003-01-12 UTC" "2003-02-28 UTC" "2004-05-20 UTC"
> deadline.using.days <- date.in + days(6)
> deadline.using.days
[1] "2001-09-05 UTC" "2003-01-18 UTC" "2003-03-06 UTC" "2004-05-26 UTC"
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的方法可以增加六个工作日 - 即周六和周日不跳?谢谢.
该软件包bizdays具有offset将给定日期偏移多个工作日的功能。它依赖于您定义的日历,当然您可以定义一个日历,其中周末是唯一的非工作日。
这是一个例子:
library(lubridate)
library(bizdays)
cal <- Calendar(weekdays=c('saturday', 'sunday'))
date.in <- dmy(c("30-8-2001", "12-1-2003", "28-2-2003", "20-5-2004"))
bizdays::offset(date.in, 6, cal)
# [1] "2001-09-07" "2003-01-21" "2003-03-10" "2004-05-28"
Run Code Online (Sandbox Code Playgroud)
2018更新
该功能Calendar在bizdays已重命名为create.calendar,但(在2018年4月)一个警告不再发行。
现在的代码应该稍有不同:
library(lubridate)
library(bizdays)
create.calendar(name="mycal", weekdays=c('saturday', 'sunday'))
date.in <- dmy(c("30-8-2001", "12-1-2003", "28-2-2003", "20-5-2004"))
bizdays::offset(date.in, 6, "mycal")
# [1] "2001-09-07" "2003-01-21" "2003-03-10" "2004-05-28"
Run Code Online (Sandbox Code Playgroud)
有一个漂亮的函数isBizday中timeDate,使得这比它似乎乍一看更多的乐趣包.
date.in <- dmy(c("30-8-2001", "12-1-2003", "28-2-2003", "20-5-2004"))
Run Code Online (Sandbox Code Playgroud)
这是一个完成工作的功能.选择1:10展望未来的日子似乎是合理的,但当然可以调整.
deadline <- function(x) {
days <- x + 1:10
Deadline <- days[isBizday(as.timeDate(days))][6]
data.frame(DateIn = x, Deadline, DayOfWeek = weekdays(Deadline),
TimeDiff = difftime(Deadline, x))
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
library(timeDate)
Reduce(rbind, Map(deadline, as.Date(date.in)))
# DateIn Deadline DayOfWeek TimeDiff
# 1 2001-08-30 2001-09-07 Friday 8 days
# 2 2003-01-12 2003-01-20 Monday 8 days
# 3 2003-02-28 2003-03-10 Monday 10 days
# 4 2004-05-20 2004-05-28 Friday 8 days
Run Code Online (Sandbox Code Playgroud)