使用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
相关产品推荐
相关产品推荐

