如何在RStudio中实现NETWORKDAYS.INTL计算月度病假工作日
RStudio实现特定月度病假工作日计算方案
1. 依赖包准备
我们可以用lubridate处理日期格式,bizdays包实现类似Excel NETWORKDAYS.INTL的工作日计算逻辑:
# 首次运行安装依赖包 install.packages(c("lubridate", "bizdays")) # 加载包 library(lubridate) library(bizdays)
2. 自定义工作日日历
先定义2023年本国节假日数组,再创建对应工作日规则的日历(以周末为周六周日为例,对应Excel NETWORKDAYS.INTL参数1):
# 替换为实际2023年本国节假日日期 holidays_2023 <- ymd(c("2023-01-01", "2023-01-22", "2023-01-23", "2023-01-24", "2023-04-05", "2023-04-29", "2023-04-30", "2023-05-01", "2023-06-22", "2023-06-23", "2023-09-29", "2023-10-01", "2023-10-02", "2023-10-03", "2023-10-04", "2023-10-05", "2023-10-06")) # 创建2023年工作日日历 create.calendar(name = "Local_2023", holidays = holidays_2023, weekdays = c("saturday", "sunday"), # 可根据实际周末规则调整 start.date = "2023-01-01", end.date = "2023-12-31")
3. 计算特定月度内的病假工作日
假设你的数据框为sick_leave_df,包含sick_start(病假起始日)、sick_end(病假结束日)、target_month(目标计算月度,格式如"2023-03"),以下是核心计算逻辑:
# 示例数据框 sick_leave_df <- data.frame( sick_start = ymd(c("2023-03-27", "2023-05-30", "2023-09-28")), sick_end = ymd(c("2023-04-03", "2023-06-02", "2023-10-05")), target_month = c("2023-03", "2023-06", "2023-09") ) # 定义计算函数 calc_monthly_sick_workdays <- function(start_dt, end_dt, target_mth) { # 转换目标月度为当月首尾日期 mth_start <- ymd(paste0(target_mth, "-01")) mth_end <- ceiling_date(mth_start, "month") - days(1) # 截取病假在目标月度内的实际区间 actual_start <- max(start_dt, mth_start) actual_end <- min(end_dt, mth_end) # 若区间无效(结束早于起始)返回0 if (actual_end < actual_start) return(0) # 计算工作日数 bizdays(actual_start, actual_end, cal = "Local_2023") } # 批量计算并添加结果列 sick_leave_df$monthly_sick_workdays <- mapply(calc_monthly_sick_workdays, sick_leave_df$sick_start, sick_leave_df$sick_end, sick_leave_df$target_month) # 查看结果 print(sick_leave_df)
4. 与Excel公式逻辑对齐
参考Excel公式示例:
=NETWORKDAYS.INTL(MAX(A2, DATE(YEAR(C2), MONTH(C2), 1)), MIN(B2, EOMONTH(C2,0)), 1, H:H)R方案完全匹配该逻辑:
max(start_dt, mth_start)和min(end_dt, mth_end)对应Excel中截取月度内病假区间的逻辑bizdays函数的cal参数对应节假日数组,weekdays参数对应Excel的周末规则参数
内容的提问来源于stack exchange,提问作者samdestructo
相关产品推荐
相关产品推荐

