如何在R DataFrame中添加列统计指定月份工作日的出现次数?
在R中为数据框添加「当月工作日数」列的实现方法
核心思路
按「年月」分组,统计每组内周一至周五的天数(即工作日数),再将统计结果匹配回原数据的对应行。可以用lubridate处理日期格式,dplyr完成分组计算,这两个工具是R中处理这类需求的常用组合。
步骤与代码示例
假设你的数据框名为df,日期列名为date:
- 加载必要的包
library(lubridate) library(dplyr)
- 确保日期列是日期格式
如果日期列还不是日期类型,先根据实际格式转换:
df$date <- ymd(df$date) # 适用于"年-月-日"格式,比如"2024-05-20" # 若格式是"日/月/年",替换为df$date <- dmy(df$date) # 若格式是"月/日/年",替换为df$date <- mdy(df$date)
- 计算每月工作日数并合并回原数据框
# 生成年月分组键,统计每个月的工作日数 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
相关产品推荐
相关产品推荐

