繁体   English   中英

计算工作日

[英]Calculating Business Days

我正在尝试计算两天之间的工作日。 成功地,我从这个问题( 计算 R 中两个日期之间的工作日数)计算了没有SaturdaySunday的天,现在我正在尝试将国定假日实施到此代码中。 如何在此处添加国定假日?

我用这段代码来计算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))
}

第二个改进:如果你想在数据帧上使用这个函数,你可以使用mapplysapply或等效函数,但你也可以向量化该函数并使其接受向量(然后它也可以在dplyr::mutate函数中使用)。 重要的是设置哪些参数被视为向量,哪些不是,我选择要向量化的起始日期和截止日期,其他参数对于每一行都被认为是相等的。 (当您考虑每周工作少于 5 天的人的每行合同工作日时,情况可能并非如此)。

CountWorkdaysV <- Vectorize(CountWorkdays, c("from", "to"))

最后的调整似乎有效,但我不太确定性能影响,因此在采用此功能之前请检查。

希望这能帮助那些像我一样通过谷歌偶然发现这个老问题的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM