我正试着计算两天之间的营业天数。成功地,我从这个问题( Saturday
)计算了没有Sunday
和Sunday
的天数(Calculate the number of weekdays between 2 dates in R),现在我正在尝试将国定假日实现到这段代码中。我怎样才能在这里加上国庆节呢?
我使用这段代码来计算weekdays
。
Nweekdays <- function(a, b) {
sum(!weekdays(seq(a, b, "days")) %in% c("Saturday", "Sunday"))}
发布于 2017-08-07 22:17:10
更新了你的功能,这样就可以增加假期.
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
虽然公历是全球性的,但周末和假日的定义取决于国家、地区等。
发布于 2020-06-29 10:46:41
有一些问题的双日包,我偶然发现了这个解决方案。我已经对解决方案进行了两种方式的调整,一种是对玛丽正在经历的错误的回答。
第一个改进:weekend <- c("Saturday", "Sunday")
依赖于语言,因此我将其更改为wday
函数,并使用数字表示引用天数。此外,我还添加了默认设置,使星期六和星期日成为空闲日,并添加了包含最后一个日期或不包括最后一个日期的选项:
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上使用该函数,您可以使用mapply
、sapply
或等效函数,但也可以将该函数向量化并使其接受向量(然后它也可在dplyr::mutate
函数中使用)。重要的是设置哪些参数被认为是向量,哪些不是,我选择从和日期向量,其他的被认为是平等的每一行。(一种情况可能不是这样,即考虑每排工作少于五天的人每排合同工作日)。
CountWorkdaysV <- Vectorize(CountWorkdays, c("from", "to"))
最后一次调整似乎有效,但我不太确定性能影响,所以在采用此功能之前检查一下。
希望这能帮助那些像我一样在谷歌上偶然发现这个老问题的人。
2019,2020和2021年美国联邦假日( https://www.opm.gov/policy-data-oversight/pay-leave/federal-holidays/ )
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"))
示例使用:
CountWorkdaysV(as.Date("2021-01-15"), as.Date("2021-01-31"), holidays = holidays, include_last = TRUE)
# 9 days
https://stackoverflow.com/questions/45556247
复制相似问题