计算营业日

时间:2017-08-07 21:51:44

标签: r

我正在尝试计算两天之间的工作日。成功地,我从这个问题(Calculate the number of weekdays between 2 dates in R)计算了没有SaturdaySunday的天数,现在我正在尝试将国家假日纳入此代码。如何在这里添加国定假日?

我使用此代码计算weekdays

Nweekdays <- function(a, b) {
  sum(!weekdays(seq(a, b, "days")) %in% c("Saturday", "Sunday"))}

2 个答案:

答案 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))
}

第二个改进:如果要在数据帧上使用此函数,可以使用mapplysapply或等效函数,但也可以对函数进行矢量化处理并使其接受矢量(然后是也可以在dplyr::mutate函数中使用)。重要的是设置哪些自变量是矢量,哪些自变量,我选择要从日期到日期进行矢量化,其他自变量认为每一行都是相等的。 (这种情况可能并非如此,当您考虑每周工作少于五天的人员的每行合同工作天数时。)

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

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

希望这可以帮助像我一样通过Google偶然发现这个旧问题的人。