如何按指定日期范围聚合Pandas DataFrame中DatetimeIndex对应的值?
实现指定日期范围的聚合分组
绝对可以实现这个需求!我们可以利用Pandas的searchsorted和分组功能来精准匹配你要的日期区间规则,以下是完整的解决方案:
步骤1:准备数据和日期范围
首先先定义你的原始DataFrame和目标日期区间:
import pandas as pd df = pd.DataFrame({ 'Dates': pd.to_datetime(['2022-04-15','2022-05-15','2022-06-15','2022-07-15', '2022-08-15','2022-09-15','2023-10-15']), 'Values': [100,150,200,150,100,250,100] }) daterange1 = pd.date_range('2022-03-31','2022-04-30', freq='M') daterange2 = pd.date_range(daterange1[-1],'2022-11-30', freq='3M') daterange = daterange1.union(daterange2)
步骤2:为每条数据匹配对应的聚合日期
我们用searchsorted来找到每条记录应该归属到哪个日期区间的结束点,同时处理那些超出最后一个区间的日期(比如你的2023-10-15):
# 找到每条Dates对应的目标区间索引(side='right'表示找第一个大于当前日期的区间点) df['group_idx'] = daterange.searchsorted(df['Dates'], side='right') # 把超出最后一个区间的记录归到最后一个区间 df['group_idx'] = df['group_idx'].clip(upper=len(daterange)-1) # 把索引映射到对应的日期 df['group_date'] = daterange[df['group_idx']]
步骤3:分组求和并补全缺失区间
按匹配到的日期分组求和,再和完整的daterange合并,填充没有数据的区间值为0:
# 分组求和 aggregated = df.groupby('group_date')['Values'].sum().reset_index() # 合并完整日期范围,填充缺失值为0 result = pd.DataFrame({'Dates': daterange}).merge( aggregated, left_on='Dates', right_on='group_date', how='left' ).drop('group_date', axis=1) result['Values'] = result['Values'].fillna(0).astype(int)
最终结果
运行后result就是你想要的输出:
Dates Values 0 2022-03-31 0 1 2022-04-30 100 2 2022-07-31 500 3 2022-10-31 450
这个方法逻辑清晰,能精准处理所有边界情况(包括无数据的区间、超出最后一个区间的日期),而且效率也很高。
内容的提问来源于stack exchange,提问作者erka




