基于年、月列创建含当月第7个工作日的新列
生成对应年月的第7个工作日列解决方案
基础实现(仅排除周末)
不需要额外合并年月为辅助列,直接通过apply结合pandas.bdate_range即可实现:
- 导入依赖库
import pandas as pd
- 定义计算第7个工作日的函数
def get_seventh_business_day(year, month): # 构造当月第一天的时间戳 month_start = pd.Timestamp(year=year, month=month, day=1) # 生成当月前7个工作日,取最后一个即为第7个工作日 seventh_bd = pd.bdate_range(start=month_start, periods=7)[-1] # 转换为YYYY-MM-DD格式字符串 return seventh_bd.strftime('%Y-%m-%d')
- 应用到DataFrame生成新列
df['PredictionDate'] = df.apply(lambda row: get_seventh_business_day(row['YearOfSRC'], row['MonthNumberOfSRC']), axis=1)
进阶实现(排除周末+美国节假日)
针对月初节假日(如新年、独立日)导致的偏移问题,可结合美国联邦节假日日历进行调整:
- 导入额外依赖
from pandas.tseries.holiday import USFederalHolidayCalendar
- 定义包含节假日处理的函数
def get_seventh_business_day_with_holidays(year, month): month_start = pd.Timestamp(year=year, month=month, day=1) # 获取当月及次月月初的美国联邦节假日(覆盖整个目标月份) holiday_cal = USFederalHolidayCalendar() holidays = holiday_cal.holidays(start=month_start, end=month_start + pd.DateOffset(months=1)) # 生成排除周末和节假日的工作日序列,取第7个 seventh_bd = pd.bdate_range(start=month_start, periods=7, holidays=holidays, freq='C')[0] return seventh_bd.strftime('%Y-%m-%d')
- 应用到DataFrame
df['PredictionDate'] = df.apply(lambda row: get_seventh_business_day_with_holidays(row['YearOfSRC'], row['MonthNumberOfSRC']), axis=1)
说明
bdate_range默认生成仅排除周末的工作日序列;指定freq='C'并传入holidays参数后,会同时排除自定义节假日。- 无需使用
groupby,因为每个行的年月是独立的,逐行计算即可满足需求。
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

