[英]Calculating Business Days
我正在尝试计算两天之间的工作日。 成功地,我从这个问题( 计算 R 中两个日期之间的工作日数)计算了没有Saturday
和Sunday
的天数,现在我正在尝试将国定假日实施到此代码中。 如何在此处添加国定假日?
我用这段代码来计算weekdays
。
Nweekdays <- function(a, b) {
sum(!weekdays(seq(a, b, "days")) %in% c("Saturday", "Sunday"))}
稍微更新了您的功能,以便可以添加假期...
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
虽然公历非常全球化,但周末和假期的定义取决于国家、地区等。
bizdays 包有一些问题,我遇到了这个解决方案。 我以两种方式调整了解决方案,一种是对 Marie 在评论中遇到的错误的回答。
第一个改进: 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
函数中使用)。 重要的是设置哪些参数被视为向量,哪些不是,我选择要向量化的起始日期和截止日期,其他参数对于每一行都被认为是相等的。 (当您考虑每周工作少于 5 天的人的每行合同工作日时,情况可能并非如此)。
CountWorkdaysV <- Vectorize(CountWorkdays, c("from", "to"))
最后的调整似乎有效,但我不太确定性能影响,因此在采用此功能之前请检查。
希望这能帮助那些像我一样通过谷歌偶然发现这个老问题的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.