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

如何在R DataFrame中添加列统计指定月份工作日的出现次数?

在R中为数据框添加「当月工作日数」列的实现方法

核心思路

按「年月」分组,统计每组内周一至周五的天数(即工作日数),再将统计结果匹配回原数据的对应行。可以用lubridate处理日期格式,dplyr完成分组计算,这两个工具是R中处理这类需求的常用组合。

步骤与代码示例

假设你的数据框名为df,日期列名为date:

  1. 加载必要的包
library(lubridate)
library(dplyr)
  1. 确保日期列是日期格式
    如果日期列还不是日期类型,先根据实际格式转换:
df$date <- ymd(df$date) # 适用于"年-月-日"格式,比如"2024-05-20"
# 若格式是"日/月/年",替换为df$date <- dmy(df$date)
# 若格式是"月/日/年",替换为df$date <- mdy(df$date)
  1. 计算每月工作日数并合并回原数据框
# 生成年月分组键,统计每个月的工作日数
month_workdays <- df %>%
  mutate(year_month = floor_date(date, "month")) %>% # 将日期转为当月第一天,作为分组标识
  group_by(year_month) %>%
  summarise(working_day_in_the_month = sum(wday(date, week_start = 1) %in% 1:5))
  # wday(week_start=1)设置周一为1,1-5对应周一到周五,sum统计该月工作日总数

# 将统计结果合并回原数据框,添加目标列
df <- df %>%
  mutate(year_month = floor_date(date, "month")) %>%
  left_join(month_workdays, by = "year_month") %>%
  select(-year_month) # 可选:删除临时的年月分组列

进阶:排除法定节假日

如果需要排除法定节假日,可借助timeDate包的节假日判断功能:

library(timeDate)

month_workdays <- df %>%
  mutate(year_month = floor_date(date, "month"),
         is_weekday = wday(date, week_start = 1) %in% 1:5,
         # 这里以美国节假日为例,可替换为其他地区日历,比如CNHolidayCalendar()
         is_holiday = isHoliday(date, holidays = USHolidayCalendar())) %>%
  group_by(year_month) %>%
  summarise(working_day_in_the_month = sum(is_weekday & !is_holiday))

大数据场景:用data.table提速

如果数据量较大,推荐用data.table提升运算效率:

library(data.table)
library(lubridate)

setDT(df) # 转换为data.table格式
df[, date := ymd(date)]
df[, year_month := floor_date(date, "month")]
# 按年月分组,直接在原数据框添加目标列
df[, working_day_in_the_month := sum(wday(date, week_start=1) %in% 1:5), by = year_month]
df[, year_month := NULL] # 删除临时列

内容的提问来源于stack exchange,提问作者Mohamed Osman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:05:16