You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何按指定日期范围聚合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

火山引擎 最新活动