基于工作日差值(含周末节假日)过滤Pandas DataFrame行
解决方案
步骤1:确保日期字段为datetime类型
如果你的DATE1和DATE2还不是datetime格式,先完成转换:
import pandas as pd df['DATE1'] = pd.to_datetime(df['DATE1']) df['DATE2'] = pd.to_datetime(df['DATE2'])
步骤2:定义节假日列表
指定需要排除的节假日:
# 加入题目要求的2023年10月17日,可按需添加其他节假日 holidays = pd.to_datetime(['2023-10-17'])
步骤3:批量计算工作日差值
用pd.busday_count批量处理每行的日期对,同时处理DATE1晚于DATE2的情况:
# 计算每行的工作日差值(取绝对值保证结果为正) df['workday_diff'] = df.apply( lambda row: pd.busday_count( min(row['DATE1'], row['DATE2']), max(row['DATE1'], row['DATE2']), holidays=holidays ), axis=1 )
注意:
pd.busday_count是左闭右开逻辑,比如从周一到周三(无节假日),结果为2(仅统计周二、周三)。如果需要包含起始/结束日期,可在结果基础上加1。
步骤4:过滤并拆分DataFrame
提取符合条件的行到新表,同时从原表移除这些行:
# 筛选出工作日差超过2天的行 filtered_df = df[df['workday_diff'] > 2].copy() # 原表保留剩余行 df = df[~(df['workday_diff'] > 2)].copy() # 可选:删除临时计算的差值列 filtered_df.drop('workday_diff', axis=1, inplace=True) df.drop('workday_diff', axis=1, inplace=True)
补充说明
- 若你的数据中
DATE1始终早于或等于DATE2,可以去掉min和max,直接用row['DATE1'], row['DATE2']计算。 - 需要新增节假日时,直接在
holidays列表中补充日期字符串即可。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

