如何在Pandas DataFrame中计算两个日期的天数差(仅排除周日)
在Pandas DataFrame中计算仅排除周日的日期天数差
要计算两个日期之间的天数差且仅排除周日(周六保留),核心逻辑是总天数减去日期范围内的周日数量,下面提供两种实用方法:
方法1:自定义函数(适合小数据集)
写一个简单的函数遍历每行日期范围,统计周日数量后计算差值:
import pandas as pd import numpy as np def calc_days_excl_sunday(start, end): # 生成完整的日期序列 date_range = pd.date_range(start=start, end=end) # 统计周日数量(weekday=6代表周日) sunday_num = np.sum(date_range.weekday == 6) # 总天数(含首尾)减去周日数 return (end - start).days + 1 - sunday_num # 测试用DataFrame df = pd.DataFrame({ 'start': ['2024-05-01', '2024-05-10'], 'end': ['2024-05-07', '2024-05-15'] }) # 先转换日期格式 df['start'] = pd.to_datetime(df['start']) df['end'] = pd.to_datetime(df['end']) # 应用函数计算结果 df['days_excl_sunday'] = df.apply(lambda row: calc_days_excl_sunday(row['start'], row['end']), axis=1) print(df)
运行后输出:
start end days_excl_sunday 0 2024-05-01 2024-05-07 6 1 2024-05-10 2024-05-15 5
方法2:向量化运算(适合大数据集)
如果DataFrame行数很多,apply效率偏低,用向量化方法直接计算,速度更快:
import pandas as pd import numpy as np df = pd.DataFrame({ 'start': pd.to_datetime(['2024-05-01', '2024-05-10']), 'end': pd.to_datetime(['2024-05-07', '2024-05-15']) }) # 计算总天数(包含首尾日期) total_days = (df['end'] - df['start']).dt.days + 1 # 定义函数统计从epoch到指定日期的周日总数 def count_total_sundays(date_series): days_since_epoch = (date_series - pd.Timestamp('1970-01-01')).dt.days # 1970-01-04是第一个周日(距离epoch3天) return np.where(days_since_epoch >= 3, (days_since_epoch - 3) // 7 + 1, 0) # 计算[start, end]区间内的周日数:end的周日总数 - (start-1天)的周日总数 sundays_before_start = count_total_sundays(df['start'] - pd.Timedelta(days=1)) sundays_up_to_end = count_total_sundays(df['end']) sunday_count = sundays_up_to_end - sundays_before_start # 最终结果 df['days_excl_sunday'] = total_days - sunday_count print(df)
注意事项
- 必须确保日期列是
datetime64类型,否则先用pd.to_datetime()转换 - 如果存在
start > end的情况,可以加入判断逻辑返回负数或0 - 方法2的向量化运算比方法1的
apply快数倍以上,适合处理十万行级别的数据
内容的提问来源于stack exchange,提问作者Harisha G
相关产品推荐
相关产品推荐

