You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:25:13