如何借助datetime索引用groupby按日-月分组跨多年数据并去除多重索引
解决方案
有两种简洁的方式可以避免生成多重索引,同时实现按「月-日」分组求最大值的需求:
方法1:直接将datetime索引格式化为mm-dd字符串分组
利用datetime索引的strftime方法,直接生成mm-dd格式的字符串作为分组键,分组结果会自动使用该字符串作为单级索引:
import numpy as np import pandas as pd # 假设df已将索引转为datetime类型 result = df.groupby(df.index.strftime('%m-%d')).agg({"Data_Value": np.max})
得到的结果会有365行(若数据包含闰年2月29日,可根据需求单独处理,比如合并到2月28日),索引为01-01到12-31的字符串格式,完全符合需求。
方法2:按一年中的第几天(dayofyear)分组后转换索引
先通过dayofyear获取每个日期在一年中的序号(1到365/366),分组后再将序号转换为mm-dd格式:
import numpy as np import pandas as pd # 按dayofyear分组求最大值 result = df.groupby(df.index.dayofyear).agg({"Data_Value": np.max}) # 将dayofyear索引转换为mm-dd格式 result.index = pd.to_datetime(result.index, format='%j').strftime('%m-%d')
这种方式分组逻辑更简洁,若后续需要对日期序号做数值运算也更方便,最后转换为mm-dd索引即可。
原代码生成多重索引的原因
你之前使用[df.index.month, df.index.day]作为分组键,本质是按两个维度(月份、日期)分组,因此Pandas会生成包含month和day的多级索引。而上面两种方法都是用单个分组键(字符串格式的mm-dd或数字格式的dayofyear),所以结果为单级索引。
内容的提问来源于stack exchange,提问作者Bennett_Eleven
相关产品推荐
相关产品推荐

