如何用Python/Pandas优雅计算分箱报告期内重叠时间区间的数量
实现思路与优化代码
我们可以直接利用pandas的向量化操作与内置区间生成能力替换冗余的循环逻辑,完整实现如下:
import numpy as np import pandas as pd import datetime as dt # 原始事件数据 df = pd.DataFrame(columns=['id','start','end'], index=range(7), data=[[1,'2006-01-01','2007-10-01'], [2,'2007-10-02','2008-12-01'], [3,'2010-01-15','2010-10-20'], [4,'2009-04-04','2010-06-03'], [5,'2010-05-12','2010-08-31'], [6,'2016-05-12','2199-12-31'], [7,'2016-05-12','2199-12-31']]) # 报告期配置 reporting_period_start = '2010-01-01' reporting_period_end = '2011-01-01' reporting_freq = 'MS' # 1. 批量转换日期格式(向量化操作,替代逐行apply) df[['start', 'end']] = df[['start', 'end']].apply(pd.to_datetime) # 2. 批量生成事件区间 df['interval'] = df.apply(lambda x: pd.Interval(x['start'], x['end']), axis=1) # 3. 直接生成报告期区间列表,替代手动循环拼接 report_intervals = pd.interval_range(start=pd.Timestamp(reporting_period_start), end=pd.Timestamp(reporting_period_end), freq=reporting_freq, closed='right') # 4. 向量化判断重叠并求和,替代两层for循环 result_list = np.vstack([df['interval'].apply(lambda x: x.overlaps(period)) for period in report_intervals]).sum(axis=1) print(result_list)
核心优化点
- 日期转换直接使用
pd.to_datetime的向量化能力,无需自定义转换函数 - 调用
pd.interval_range一键生成报告期区间,省去手动遍历拼接的冗余代码 - 利用广播机制做重叠判断,直接按维度求和得到结果,省略两层循环逻辑,代码量减少近一半,大数据量下性能提升显著
内容的提问来源于stack exchange,提问作者karlvb
相关产品推荐
相关产品推荐

