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

使用Pandas将多索引月日时间序列扩展为10年每日单索引数据

问题:将月日多层索引的时间序列扩展为多年完整日期的单索引DataFrame

我有一个以月份和日期为多层索引的时间序列DataFrame,包含A、B、C三列,数据结构如下:

A   B   C
1  1  21  32   4
   2   4   2  23
   3  12   9  10
   4   1  56  37
...
   30 63   1  27
   31 32   2  32
...
12 1   2   3  23
   2  23   1  12
   3  32   3  23
...
   31 23   2  32

需要将其转换为单索引的每日时间序列,把原数据映射到指定年份范围(示例为2017-2022年)的对应日期,生成包含完整年月日的DataFrame,期望输出格式如下:

A   B   C
01/01/2017  21  32   4
...
31/12/2017  23   2  32
...
01/01/2022  21  32   4
...
31/12/2022  23   2  32

解决方案

步骤1:拆解原多层索引并生成月日标识

先将原DataFrame的多层索引(月、日)转为列,再组合成统一格式的MM-DD字符串,用于后续匹配:

import pandas as pd

# 假设原数据存储在变量df中
df_reset = df.reset_index()
# 生成两位格式的月-日字符串(如1月1日转为"01-01")
df_reset['month_day'] = df_reset['level_0'].astype(str).str.zfill(2) + '-' + df_reset['level_1'].astype(str).str.zfill(2)
# 移除多余的索引列
df_reset = df_reset.drop(['level_0', 'level_1'], axis=1)

步骤2:生成目标年份的完整日期序列

指定需要扩展的年份区间,生成该区间内的所有每日日期,并提取每个日期的MM-DD标识:

# 设置目标年份范围
start_year = 2017
end_year = 2022
# 生成完整日期序列
full_dates = pd.date_range(start=f"{start_year}-01-01", end=f"{end_year}-12-31", freq="D")
date_df = pd.DataFrame({"full_date": full_dates})
# 提取每个日期的月日标识
date_df['month_day'] = date_df['full_date'].dt.strftime("%m-%d")

步骤3:合并数据并设置最终索引

通过month_day字段将原数据与完整日期序列合并,然后设置完整日期为索引,整理输出格式:

# 合并数据,保证每个日期都能匹配到对应月日的原数据
result = pd.merge(date_df, df_reset, on="month_day", how="left")
# 设置完整日期为索引,并移除中间字段
result = result.set_index("full_date").drop("month_day", axis=1)
# 可选:将索引格式化为dd/mm/yyyy的字符串形式
result.index = result.index.strftime("%d/%m/%Y")

补充说明

  • 闰年处理:如果原数据中没有2月29日的记录,合并后闰年的2月29日会出现空值,可使用result.fillna(method='ffill')或result.fillna(result.mean())等方式填充。
  • 索引格式:如果不需要将索引转为字符串,可保留datetime类型,方便后续时间序列分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:30:51