You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:36:03