如何在Python Dataframe中按年月重组日期索引的数据
按年月重组日期索引DataFrame的实现方案
需求说明
你有一个以FECHA为日期索引的DataFrame,需将数据重组为:
- 行:西班牙语月份名称(Enero至Diciembre)
- 列:日期的日(1-31)
- 单元格:对应月份同一天的聚合值(示例为均值)
实现步骤与代码
假设你的DataFrame名为df,按以下步骤处理:
- 确保索引为datetime类型
如果索引还不是日期格式,先转换:
import pandas as pd df.index = pd.to_datetime(df.index)
- 提取月份(西语)和日字段
从日期索引中拆分出月份名称和日:
# 生成西语月份列,Linux/macOS一般默认支持es_ES locale,Windows可改用手动映射 df['MES'] = df.index.month_name(locale='es_ES') df['DIA'] = df.index.day
- 透视表重组数据
使用pivot_table按月份和日聚合,这里以SUMA列的均值为例,可替换为sum等其他聚合函数:
# 生成透视表,索引为月份,列为日,值为SUMA的均值 resultado = df.pivot_table( index='MES', columns='DIA', values='SUMA', aggfunc='mean' )
- 调整月份顺序
默认透视表会按字母排序月份,需手动指定西语月份的自然顺序:
orden_meses = [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ] resultado = resultado.reindex(orden_meses)
- 格式化小数显示
将结果的小数分隔符改为逗号,匹配示例格式:
# 保留6位小数,替换小数点为逗号,空值显示为空字符串 resultado = resultado.applymap(lambda x: f"{x:.6f}".replace('.', ',') if pd.notna(x) else '')
- 查看最终结果
print(resultado)
补充说明
- 若需处理其他列(如
H04_PEDRO_MARIN),只需修改pivot_table中的values参数为对应列名 - Windows系统若无法识别
es_ESlocale,可手动映射月份:mes_map = { 1: 'Enero', 2: 'Febrero', 3: 'Marzo', 4: 'Abril', 5: 'Mayo', 6: 'Junio', 7: 'Julio', 8: 'Agosto', 9: 'Septiembre', 10: 'Octubre', 11: 'Noviembre', 12: 'Diciembre' } df['MES'] = df.index.month.map(mes_map)
内容的提问来源于stack exchange,提问作者Guille GL
相关产品推荐
相关产品推荐

