在lubridate增加15个工作日

ema*_*gar 5 r lubridate

我有一长串某个程序的开始日期.规则要求程序最多在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)

是否有一个简单的方法可以增加六个工作日 - 即周六和周日不跳?谢谢.

Wil*_*tas 6

该软件包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更新

该功能Calendarbizdays已重命名为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)


Ric*_*ven 5

有一个漂亮的函数isBizdaytimeDate,使得这比它似乎乍一看更多的乐趣包.

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)