我正在尝试计算两天之间的工作日。成功地,我从这个问题(Calculate the number of weekdays between 2 dates in R)计算了没有Saturday
和Sunday
的天数,现在我正在尝试将国家假日纳入此代码。如何在这里添加国定假日?
我使用此代码计算weekdays
。
Nweekdays <- function(a, b) {
sum(!weekdays(seq(a, b, "days")) %in% c("Saturday", "Sunday"))}
答案 0 :(得分:2)
稍微更新了您的功能,以便添加假期......
Nweekdays <- function(a, b, holidays, weekend) {
possible_days <- seq(a, b, "days")
# Count all days that are not weekend and
# are not holidays
sum(!weekdays(possible_days) %in% weekend & !possible_days %in% holidays)
}
weekend <- c("Saturday", "Sunday")
holidays <- as.Date(c("2017-12-31", "2017-12-24", "2017-07-04"))
Nweekdays(as.Date("2017-08-01"), as.Date("2017-12-31"), holidays, weekend)
[1] 109
虽然公历非常全球化,但周末和假期的定义取决于国家,地区等。
答案 1 :(得分:1)
在bizdays软件包中存在一些问题,我遇到了此解决方案。我用两种方法调整了解决方案,一种是从评论中遇到的错误中解决玛丽的问题。
第一个改进:
weekend <- c("Saturday", "Sunday")
取决于语言,因此我将其更改为wday
函数,并使用数字表示日期。此外,我添加了默认设置,使星期六和星期日为免费日,并添加了是否包括最后日期的选项:
CountWorkdays <- function(from, to, holidays = c(), free = c(7,1), include_last = FALSE) { # Create list of all days possible_days <- seq(from, to, "days") # Include last? If not, remove last item. if (!include_last) { possible_days <- possible_days[-length(possible_days)] } # Count all days that are not weekend and are not holidays return(sum(!wday(possible_days) %in% free & !possible_days %in% holidays)) }
第二个改进:如果要在数据帧上使用此函数,可以使用mapply
,sapply
或等效函数,但也可以对函数进行矢量化处理并使其接受矢量(然后是也可以在dplyr::mutate
函数中使用)。重要的是设置哪些自变量是矢量,哪些自变量,我选择要从日期到日期进行矢量化,其他自变量认为每一行都是相等的。 (这种情况可能并非如此,当您考虑每周工作少于五天的人员的每行合同工作天数时。)
CountWorkdaysV <- Vectorize(CountWorkdays, c("from", "to"))
最后一次调整似乎有效,但是我对性能的影响不确定,因此在使用此功能之前请检查。
希望这可以帮助像我一样通过Google偶然发现这个旧问题的人。