如何将Pandas数据按月份分组并对X1、X2等列求和?
解决按月份分组求和的时间格式与排序问题
第一步:确保日期为datetime类型
这是解决时间格式错误的核心前提,不管Date是列还是索引,必须先转为datetime类型:
- 读取文件时直接处理:
import pandas as pd data = pd.read_csv('MLs_Unit_per_day.csv', index_col='Date', parse_dates=True) - 已读取文件后转换索引:
data.index = pd.to_datetime(data.index)
第二步:按月份分组求和(修正排序问题)
直接用月份名称分组会导致字母序排序(比如"April"排在"August"前),以下是两种可靠的解决方式:
方法1:按月份数字分组,映射为名称并按自然顺序排序
# 按月份数字分组,对X1-X6列求和 monthly_sum = data.groupby(data.index.month)[['X1', 'X2', 'X3', 'X4', 'X5', 'X6']].sum() # 将月份数字替换为完整名称 monthly_sum.index = pd.to_datetime(monthly_sum.index, format='%m').month_name() # 按自然月份顺序重新排列 monthly_sum = monthly_sum.reindex([ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ])
方法2:按年月周期分组(保留年度信息,避免跨年度合并)
如果数据包含多个年份,建议同时按年和月分组,防止不同年份的同月份数据被错误合并:
# 按年月周期分组,自动按时间顺序排序 year_month_sum = data.groupby(data.index.to_period('M'))[['X1', 'X2', 'X3', 'X4', 'X5', 'X6']].sum() # 若需要单独提取月份名称(需注意会丢失年度信息) year_month_sum.index = year_month_sum.index.strftime('%Y-%B')
原代码出错原因
- 时间格式错误:
Date列/索引未转为datetime类型,无法调用dt属性,导致报错。 - 月份排序错误:
dt.strftime('%B')生成的月份名称会按字母顺序排序,而非自然的月份先后顺序。
内容的提问来源于stack exchange,提问作者NaS
相关产品推荐
相关产品推荐

