Python如何基于pandas实现多日期字段的DateDuration条件计算
多层嵌套日期间隔计算实现方案
实现思路
原有代码仅转换了2个日期列的类型,且条件未覆盖全部嵌套分支。使用np.select按优先级从高到低排列判断条件即可无嵌套实现全部逻辑:np.select会按顺序匹配条件,命中第一个符合的条件后直接返回对应结果,天然适配多层判断逻辑。
判断优先级严格匹配给定规则:
- 优先级1:SecondDate与FirstDate间隔≥28天 → 取两日期差值
- 优先级2:SecondDate间隔<28天,且ThirdDate为空 → 取SecondDate与FirstDate差值
- 优先级3:SecondDate间隔<28天,ThirdDate非空,且ThirdDate与FirstDate间隔≥28天 → 取ThirdDate与FirstDate差值
- 优先级4:SecondDate间隔<28天,ThirdDate非空,ThirdDate间隔<28天,且FourthDate为空 → 取ThirdDate与FirstDate差值
- 优先级5:剩余情况(SecondDate间隔<28天、ThirdDate非空、ThirdDate间隔<28天、FourthDate非空)→ 取FourthDate与FirstDate差值
完整可运行代码
import pandas as pd import numpy as np # 全部日期列统一转换为datetime类型,空值自动转为NaT df['FirstDate'] = pd.to_datetime(df['FirstDate']) df['SecondDate'] = pd.to_datetime(df['SecondDate']) df['ThirdDate'] = pd.to_datetime(df['ThirdDate']) df['FourthDate'] = pd.to_datetime(df['FourthDate']) # 计算各日期与FirstDate的间隔天数,NaT对应的天数为NaN x = (df['SecondDate'] - df['FirstDate']).dt.days y = (df['ThirdDate'] - df['FirstDate']).dt.days z = (df['FourthDate'] - df['FirstDate']).dt.days # 按优先级排列条件和对应返回值 condlist = [ x >= 28, (x < 28) & (pd.isna(y)), (x < 28) & (~pd.isna(y)) & (y >= 28), (x < 28) & (~pd.isna(y)) & (y < 28) & (pd.isna(z)), (x < 28) & (~pd.isna(y)) & (y < 28) & (~pd.isna(z)) ] choicelist = [ x, x, y, y, z ] # 生成最终计算列 df['DateDuration'] = np.select(condlist, choicelist)
结果验证
用提供的示例数据运行后,计算结果与给定的DateDuration列完全匹配:
| ID | FirstDate | SecondDate | ThirdDate | FourthDate | DateDuration |
|---|---|---|---|---|---|
| 2914300 | 2021-09-23 | 2021-10-07 | 2021-11-29 | 2021-12-20 | 67 |
| 3893461 | 2021-09-08 | 2021-10-06 | 2022-04-07 | 211 | |
| 4343075 | 2021-06-23 | 2021-09-27 | 96 | ||
| 4347772 | 2021-06-23 | 2021-09-27 | 96 | ||
| 4551963 | 2021-08-02 | 2021-10-14 | 2022-03-11 | 73 | |
| 4893324 | 2021-09-30 | 2021-10-01 | 2022-03-03 | 2022-03-10 | 154 |
| 5239991 | 2021-06-24 | 2021-08-26 | 2021-09-25 | 2022-02-03 | 63 |
| 8454947 | 2021-09-28 | 2021-10-05 | 7 | ||
| 8581390 | 2021-09-27 | 2022-03-21 | 2022-03-25 | 175 | |
| 8763766 | 2021-09-20 | 2021-10-04 | 2021-12-09 | 80 | |
| 9144185 | 2021-06-18 | 2021-06-23 | 5 | ||
| 9967685 | 2021-09-13 | 2021-10-29 | 2022-02-07 | 2022-03-23 | 46 |
| 11367560 | 2021-08-31 | 2021-09-28 | 2021-10-21 | 2022-02-11 | 51 |
若运行中遇到28天临界值匹配不符合预期,检查Excel内间隔计算是否包含日期当天,对应调整判断阈值即可。
内容的提问来源于stack exchange,提问作者Shichimi
相关产品推荐
相关产品推荐

