如何基于自定义日历DataFrame计算任务日期区间内的工作日数?
使用Pandas计算自定义日历区间内的工作日总数
核心思路
由于你的工作日是完全自定义规则(不遵循常规日历/节假日),必须基于提供的df_calendar表,统计每个任务起止日期区间内Work_day=True的日期数量。核心前提是先将日期列转换为datetime类型,确保能进行区间比较。
步骤1:数据预处理
先把两个DataFrame的日期列转为datetime格式:
import pandas as pd # 转换任务表的日期列 df_tasks[['Start_Date', 'End_Date']] = df_tasks[['Start_Date', 'End_Date']].apply(pd.to_datetime) # 转换日历表的日期列 df_calendar['Date'] = pd.to_datetime(df_calendar['Date'])
方法一:逐行统计(适合小数据量)
定义辅助函数,针对每个任务的起止日期筛选符合条件的工作日并计数:
def count_custom_workdays(start_date, end_date): # 筛选日期在区间内且为工作日的记录 valid_days = df_calendar[ (df_calendar['Date'] >= start_date) & (df_calendar['Date'] <= end_date) & df_calendar['Work_day'] ] return len(valid_days) # 为每个任务计算工作日总数 df_tasks['Total_workdays'] = df_tasks.apply( lambda row: count_custom_workdays(row['Start_Date'], row['End_Date']), axis=1 )
方法二:批量合并统计(适合大数据量)
用Pandas向量化操作替代逐行循环,提升效率:
# 先提取所有工作日的日历记录 workday_calendar = df_calendar[df_calendar['Work_day']].copy() # 交叉合并任务表与工作日表,生成所有任务-工作日组合 cross_merged = pd.merge(df_tasks, workday_calendar, how='cross') # 筛选出每个任务区间内的有效工作日 valid_matches = cross_merged[ (cross_merged['Date'] >= cross_merged['Start_Date']) & (cross_merged['Date'] <= cross_merged['End_Date']) ] # 按User分组统计工作日数量 workday_counts = valid_matches.groupby('User').size().reset_index(name='Total_workdays') # 将统计结果合并回原任务表,处理无工作日的情况 df_tasks = df_tasks.merge(workday_counts, on='User', how='left') df_tasks['Total_workdays'] = df_tasks['Total_workdays'].fillna(0).astype(int)
最终结果
处理完成后,df_tasks会新增Total_workdays列,完全匹配你预期的输出格式。
内容的提问来源于stack exchange,提问作者Jaol
相关产品推荐
相关产品推荐

