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

Pandas多分组前日期转换:统一日期为当月1日并分组求和

优化实现方案

问题分析

你当前代码的核心问题有两个:

  1. 日期处理的结果没有赋值回原DataFrame,导致分组时还是用原始日期;
  2. 未将字符串格式的date列转为datetime类型,直接使用日期偏移量会引发错误。

分步优化实现

  • 1. 转换日期列类型
    先把字符串格式的日期转为datetime类型,这是后续日期操作的前提:

    df['date'] = pd.to_datetime(df['date'])
    
  • 2. 统一日期为当月1日
    推荐两种简洁且稳定的方式:

    • 方式一:用dt.floor('MS')直接取当月起始日期(MS代表Month Start)
      df['date'] = df['date'].dt.floor('MS')
      
    • 方式二:先转为月份周期,再提取周期起始时间
      df['date'] = df['date'].dt.to_period('M').dt.start_time
      

    这两种方式比pd.offsets.MonthBegin(1)更直观,避免了手动计算偏移可能出现的边界问题。

  • 3. 分组求和
    基于处理后的日期,按指定字段分组并对energy求和:

    result_df = df.groupby(['country', 'type', 'date'], as_index=False)['energy'].sum()
    

完整可运行代码

import pandas as pd

# 构造原始数据
data = {
    'country': ['US', 'US', 'US', 'US', 'US', 'AUSTRALIA'],
    'type': ['aa', 'aa', 'aa', 'bb', 'bb', 'bb'],
    'date': ['8/5/2022', '8/25/2022', '8/2/2022', '8/5/2022', '8/15/2022', '9/15/2022'],
    'energy': [10, 1, 11, 55, 25, 5]
}
df = pd.DataFrame(data)

# 执行处理流程
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].dt.floor('MS')
result_df = df.groupby(['country', 'type', 'date'], as_index=False)['energy'].sum()

print(result_df)

运行后会输出你期望的结果:

country type       date  energy
0  AUSTRALIA   bb 2022-09-01       5
1         US   aa 2022-08-01      22
2         US   bb 2022-08-01      80

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:10:39