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

如何按日期与ID分组对Pandas数据做月度重采样并取每组最后值?

高效获取每个ID的月度最后记录

最直接高效的实现方式是结合groupby与pd.Grouper,在分组阶段同时完成月份聚合,直接提取每组的最后一条记录:

import pandas as pd

data = [['01/01/2000', 'aaa', 101, 102],
        ['01/02/2000', 'aaa', 201, 202],
        ['01/01/2000', 'bbb', 301, 302],
        ['01/02/2000', 'bbb', 401, 402],]

df = pd.DataFrame(data, columns=['date', 'id', 'val1', 'val2'])
df['date'] = pd.to_datetime(df['date'])

# 核心逻辑:按ID+月份分组,取每组最后一条数据
result = df.groupby(
    ['id', pd.Grouper(key='date', freq='M')]
).last().reset_index()

print(result)

执行后输出符合预期的结果:

id       date  val1  val2
0  aaa 2000-01-31   201   202
1  bbb 2000-01-31   401   402

方案优势

  • 计算效率高:直接在分组阶段完成月份维度的聚合,避免了冗余的中间计算步骤
  • 结果整洁:无需额外处理冗余索引或行,reset_index()直接生成结构清晰的DataFrame

替代实现(逻辑等价)

也可以通过dt.to_period转换日期为月份周期后分组,效果一致:

result = df.groupby(
    ['id', df['date'].dt.to_period('M')]
).last().reset_index()
# 可选:将周期类型转回datetime格式
result['date'] = result['date'].dt.to_timestamp('M')

内容的提问来源于stack exchange,提问作者mike01010

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:24:59