如何用Python计算Event A与Event B的间隔天数(取最新A事件日期)
用Python计算最新Event A到Event B的工作日间隔天数
解决思路
类比你熟悉的SQL分组聚合逻辑,我们可以用pandas库(Python处理表格数据的标准工具)自动完成每个CaseID的最新Event A提取、Event B匹配,以及工作日间隔计算,全程无需手动去重。
完整代码实现
import pandas as pd import numpy as np # 1. 准备示例数据(替换成你的实际数据读取逻辑,比如pd.read_csv) data = [ [1, 'A', '1/1/23'], [1, 'A', '1/3/23'], [1, 'A', '1/20/23'], [1, 'B', '2/1/23'], [8, 'A', '1/2/23'], [100, 'A', '3/1/23'], [100, 'B', '3/2/23'], [35, 'A', '2/13/23'], [35, 'B', '2/27/23'], [6, 'A', '2/14/23'], [33, 'A', '2/26/23'], [2, 'A', '3/4/23'], [2, 'B', '4/30/23'] ] df = pd.DataFrame(data, columns=['CaseID', 'EVENT', 'DATE']) # 2. 将日期字符串转换为datetime类型(必须步骤,否则无法计算) df['DATE'] = pd.to_datetime(df['DATE'], format='%m/%d/%y') # 3. 提取每个CaseID的最新Event A日期 latest_a = df[df['EVENT'] == 'A'].groupby('CaseID')['DATE'].max().reset_index() latest_a.rename(columns={'DATE': 'Latest_A_Date'}, inplace=True) # 4. 提取每个CaseID的Event B日期(假设每个CaseID最多一个B事件) event_b = df[df['EVENT'] == 'B'].groupby('CaseID')['DATE'].first().reset_index() event_b.rename(columns={'DATE': 'Event_B_Date'}, inplace=True) # 5. 合并数据,只保留同时有A和B记录的CaseID result = pd.merge(latest_a, event_b, on='CaseID', how='inner') # 6. 计算工作日间隔(排除周末,不包含节假日;如需包含节假日可添加参数) result['busdaysbweventAB'] = np.busday_count( result['Latest_A_Date'].dt.date, result['Event_B_Date'].dt.date ) # 7. 输出最终结果(只保留需要的列) final_output = result[['CaseID', 'busdaysbweventAB']] print(final_output)
代码解释
- 步骤3对应SQL逻辑:
SELECT CaseID, MAX(DATE) AS Latest_A_Date FROM table WHERE EVENT='A' GROUP BY CaseID - 步骤4对应SQL逻辑:
SELECT CaseID, DATE AS Event_B_Date FROM table WHERE EVENT='B' GROUP BY CaseID np.busday_count自动排除周六周日计算工作日数量,若需排除自定义节假日,可传入holidays参数(例如holidays=['2023-01-01'])
运行结果
| CaseID | busdaysbweventAB |
|---|---|
| 1 | 10 |
| 2 | 41 |
| 35 | 10 |
| 100 | 1 |
内容的提问来源于stack exchange,提问作者jen norr
相关产品推荐
相关产品推荐

