首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算营业日

计算营业日
EN

Stack Overflow用户
提问于 2017-08-07 21:51:43
回答 2查看 2.6K关注 0票数 1

我正试着计算两天之间的营业天数。成功地,我从这个问题( Saturday )计算了没有SundaySunday的天数(Calculate the number of weekdays between 2 dates in R),现在我正在尝试将国定假日实现到这段代码中。我怎样才能在这里加上国庆节呢?

我使用这段代码来计算weekdays

代码语言:javascript
运行
复制
Nweekdays <- function(a, b) {
  sum(!weekdays(seq(a, b, "days")) %in% c("Saturday", "Sunday"))}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-07 22:17:10

更新了你的功能,这样就可以增加假期.

代码语言:javascript
运行
复制
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

虽然公历是全球性的,但周末和假日的定义取决于国家、地区等。

票数 4
EN

Stack Overflow用户

发布于 2020-06-29 10:46:41

有一些问题的双日包,我偶然发现了这个解决方案。我已经对解决方案进行了两种方式的调整,一种是对玛丽正在经历的错误的回答。

第一个改进:weekend <- c("Saturday", "Sunday")依赖于语言,因此我将其更改为wday函数,并使用数字表示引用天数。此外,我还添加了默认设置,使星期六和星期日成为空闲日,并添加了包含最后一个日期或不包括最后一个日期的选项:

代码语言:javascript
运行
复制
library(lubridate) ## lubridate for wday function
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))
}

第二个改进:如果您想要在dataframe上使用该函数,您可以使用mapplysapply或等效函数,但也可以将该函数向量化并使其接受向量(然后它也可在dplyr::mutate函数中使用)。重要的是设置哪些参数被认为是向量,哪些不是,我选择从和日期向量,其他的被认为是平等的每一行。(一种情况可能不是这样,即考虑每排工作少于五天的人每排合同工作日)。

代码语言:javascript
运行
复制
CountWorkdaysV <- Vectorize(CountWorkdays, c("from", "to"))

最后一次调整似乎有效,但我不太确定性能影响,所以在采用此功能之前检查一下。

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

2019,2020和2021年美国联邦假日( https://www.opm.gov/policy-data-oversight/pay-leave/federal-holidays/ )

代码语言:javascript
运行
复制
holidays <- as.Date(c("2019-01-01", "2019-01-21", "2019-02-18", "2019-05-27", "2019-07-04", "2019-09-02", "2019-10-14", "2019-11-11", "2019-11-28", "2019-12-25",
                      "2020-01-01", "2020-01-20", "2020-02-17", "2020-05-25", "2020-07-03", "2020-09-07", "2020-10-12", "2020-11-11", "2020-11-26", "2020-12-25",
                      "2021-01-01", "2021-01-18", "2021-01-20", "2021-02-15", "2021-05-31", "2021-06-18", "2021-07-05", "2021-09-06", "2021-10-11", "2021-11-11", "2021-11-25", "2021-12-24"))

示例使用:

代码语言:javascript
运行
复制
CountWorkdaysV(as.Date("2021-01-15"), as.Date("2021-01-31"), holidays = holidays, include_last = TRUE)
# 9 days
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45556247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档