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

如何基于自定义日历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:27:26