Pandas中满足CLOSE大于SUBMISSION条件时计算累计日期差值问题
Pandas工单累计日期差值计算方案
核心逻辑
对每一行的CLOSE日期,匹配所有工单的SUBMISSION日期,仅统计CLOSE > SUBMISSION的日期差值,将这些差值的天数求和即为当前行的ACCUM_DATE_DELTA值。
实现代码
基础实现(小数据量适用,可读性高)
import pandas as pd # 初始化样例数据 df = pd.DataFrame({'REF_KEY': [1, 2, 3, 4, 5], 'SUBMISSION': ['2018-08-21', '2018-09-03', '2018-09-07', '2018-09-06', '2018-08-28'], 'CLOSE': ['2018-09-05', '2018-09-12', '2018-09-18', '2018-09-24', '2018-09-27']}) # 转换为日期格式 df['CLOSE'] = pd.to_datetime(df['CLOSE']) df['SUBMISSION'] = pd.to_datetime(df['SUBMISSION']) # 提取所有提交日期 all_submission = df['SUBMISSION'].tolist() def calculate_delta(row): # 筛选符合条件的提交日期 valid_sub = [s for s in all_submission if s < row['CLOSE']] # 计算差值总和 return sum((row['CLOSE'] - sub).days for sub in valid_sub) df['ACCUM_DATE_DELTA'] = df.apply(calculate_delta, axis=1) # 查看结果 print(df)
高性能实现(大数据量适用,广播运算)
如果数据量较大,可使用numpy广播替代apply提升运算效率:
import numpy as np close_arr = df['CLOSE'].values[:, np.newaxis] sub_arr = df['SUBMISSION'].values[np.newaxis, :] # 生成符合条件的掩码 valid_mask = close_arr > sub_arr # 计算所有符合条件的差值总和 df['ACCUM_DATE_DELTA'] = ((close_arr - sub_arr) * valid_mask).astype('timedelta64[D]').sum(axis=1)
输出结果
运行后得到的结果和预期完全一致:
REF_KEY SUBMISSION CLOSE ACCUM_DATE_DELTA 0 1 2018-08-21 2018-09-05 25 1 2 2018-09-03 2018-09-12 57 2 3 2018-09-07 2018-09-18 86 3 4 2018-09-06 2018-09-24 116 4 5 2018-08-28 2018-09-27 131
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

