Python计算DataFrame两日期列差值且仅排除周日的实现方法
实现排除周日的日期差计算方法
首先导入依赖库:
import pandas as pd import numpy as np
核心实现代码
可直接复用你已有的日期类型转换逻辑,后续按如下方式计算:
# 已有代码,日期类型转换 df["First_date"] = df['First_date'].astype('datetime64[ns]') df["Second_date"] = df['Second_date'].astype('datetime64[ns]') # 计算原始总天数 df['total_days'] = (df['First_date'] - df['Second_date']).dt.days # 计算起始日期(Second_date)的周序:weekday返回0=周一,6=周日 s_weekday = df['Second_date'].dt.weekday # 计算第一个周日距离起始日期的间隔天数 first_sun_offset = (6 - s_weekday) % 7 # 统计区间内的周日总数 df['sundays_count'] = np.where( first_sun_offset > df['total_days'], 0, (df['total_days'] - first_sun_offset) // 7 + 1 ) # 最终结果=总天数减去周日数量 df['expected_outcome'] = df['total_days'] - df['sundays_count']
以上是向量化计算方案,适合百万级以上的大数据量场景,性能远高于逐行遍历。如果数据量很小,也可以用更直观的逐行统计写法:
df['expected_outcome'] = df.apply( lambda row: row['total_days'] - sum( 1 for d in pd.date_range(row['Second_date']+pd.Timedelta(days=1), row['First_date']) if d.weekday() == 6 ), axis=1 )
效果验证
对应你提供的测试样例,计算结果完全匹配预期:
| First_date | Second_date | total_days | sundays_count | expected_outcome |
|---|---|---|---|---|
| 2021-09-18 | 2021-09-17 | 1 | 0 | 1 |
| 2021-09-22 | 2021-09-17 | 5 | 1 | 4 |
| 2021-09-27 | 2021-09-17 | 10 | 2 | 8 |
内容的提问来源于stack exchange,提问作者user16580724
相关产品推荐
相关产品推荐

