Pandas多分组前日期转换:统一日期为当月1日并分组求和
优化实现方案
问题分析
你当前代码的核心问题有两个:
- 日期处理的结果没有赋值回原DataFrame,导致分组时还是用原始日期;
- 未将字符串格式的
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
相关产品推荐
相关产品推荐

