使用Pandas计算全部任务已关闭的交易的工作日时长
解决Pandas计算交易工作日时长问题
原代码存在的问题
- 生成
closed_deals时丢失了DEAL标识,导致无法正确筛选对应交易的数据 - 计算时长时未按交易分组,且未使用工作日计算逻辑
- 合并时长数据时缺少关联的DEAL列,无法正确匹配
修正后的完整代码
import pandas as pd import numpy as np df = pd.DataFrame({ 'START DATE': ['01/01/2023', '01/01/2023', '01/20/2023', '01/22/2023', '01/13/2023', '01/12/2023'], 'END DATE': ['01/10/2023', '01/15/2023', '01/23/2023', '01/24/2023', '01/14/2023', '01/13/2023'], 'DEAL': ['D1', 'D1', 'D2', 'D3', 'D4', 'D4'], 'TASK': ['T1', 'T2', 'T3', 'T4', 'T5', 'T6'], 'STATUS': ['Closed', 'Closed', 'Open', 'Closed', 'Open', 'Closed'] }) # 转换日期列为datetime格式,明确格式避免自动识别错误 df['START DATE'] = pd.to_datetime(df['START DATE'], format='%m/%d/%Y') df['END DATE'] = pd.to_datetime(df['END DATE'], format='%m/%d/%Y') # 按DEAL分组,完成状态校验、日期提取 deal_summary = df.groupby('DEAL').agg( ALL_CLOSED=('STATUS', lambda x: all(x == 'Closed')), START_DATE_MIN=('START DATE', 'min'), END_DATE_MAX=('END DATE', 'max') ).reset_index() # 筛选全Closed的交易,计算工作日时长 closed_deals_result = deal_summary[deal_summary['ALL_CLOSED']].copy() closed_deals_result['DURATION'] = np.busday_count( closed_deals_result['START_DATE_MIN'].values.astype('datetime64[D]'), closed_deals_result['END_DATE_MAX'].values.astype('datetime64[D]') ) # 整理列名与格式,匹配示例输出 closed_deals_result = closed_deals_result.rename(columns={ 'START_DATE_MIN': 'START DATE', 'END_DATE_MAX': 'END DATE', 'ALL_CLOSED': 'STATUS' }) closed_deals_result['STATUS'] = 'Closed' closed_deals_result = closed_deals_result[['START DATE', 'END DATE', 'DEAL', 'STATUS', 'DURATION']] print(closed_deals_result)
代码说明
- 日期转换:指定
%m/%d/%Y格式,确保日期解析准确 - 分组聚合:一次完成交易的状态校验、最早开始日期、最晚结束日期提取
- 工作日计算:用
np.busday_count自动排除周末,计算工作日数量 - 格式整理:调整列名和顺序,输出与示例一致的结果
运行结果
| START DATE | END DATE | DEAL | STATUS | DURATION |
|---|---|---|---|---|
| 2023-01-01 | 2023-01-15 | D1 | Closed | 10 |
| 2023-01-22 | 2023-01-24 | D3 | Closed | 1 |
内容的提问来源于stack exchange,提问作者d8888d
相关产品推荐
相关产品推荐

