如何在移动DataFrame列时同步扩展日期索引
解决方案
要实现你的需求,核心是先扩展日期索引,再执行列偏移,而非先偏移再处理索引。具体步骤如下:
步骤1:标准化日期格式并设置索引
先把日期转为可处理的datetime类型,方便后续生成连续的月份索引:
import pandas as pd # 原数据 data = { 'date': ['2022-4-30', '2022-5-31', '2022-6-30', '2022-7-31', '2022-8-31', '2022-9-30'], 'value1': [17.625324, 21.158160, 19.346424, 9.413752, 0.468775, -0.369166], 'value2': [None, 24.363270, 22.739159, 15.231505, 6.069972, 2.310004], 'value3': [23.195545, 19.404603, 10.832226, 9.954975, 6.238546, 4.926893] } df = pd.DataFrame(data) # 转为datetime格式并设置为索引 df['date'] = pd.to_datetime(df['date']) df = df.set_index('date')
步骤2:扩展日期索引
根据最大偏移量(value3需要偏移2,所以新增2行),生成包含后续月份的连续日期索引:
# 确定需要扩展的月份数:取各列偏移量的最大值2 expand_months = 2 # 生成新的日期范围:从原索引首日期到末日期+2个月,频率设为月末(M)确保日期格式统一 new_index = pd.date_range( start=df.index[0], end=df.index[-1] + pd.DateOffset(months=expand_months), freq='M' ) # 重新索引,新增行的value1自动填充NaN df_expanded = df.reindex(new_index)
步骤3:执行列偏移操作
对扩展后的DataFrame执行shift,被偏移的末尾数据会自动填充到新增行中:
df_expanded['value2'] = df_expanded['value2'].shift(1) df_expanded['value3'] = df_expanded['value3'].shift(2)
最终结果
执行后得到的df_expanded即为预期结果:
value1 value2 value3 2022-04-30 17.625324 NaN NaN 2022-05-31 21.158160 NaN NaN 2022-06-30 19.346424 24.363270 23.195545 2022-07-31 9.413752 22.739159 19.404603 2022-08-31 0.468775 15.231505 10.832226 2022-09-30 -0.369166 6.069972 9.954975 2022-10-31 NaN 2.310004 6.238546 2022-11-30 NaN NaN 4.926893
关键说明
- 先扩展再偏移:原方法先偏移会导致末尾数据丢失,扩展索引后再偏移,被挤出的数据会自然落在新增行里。
freq='M'确保生成的是每月最后一天,和原数据日期格式匹配。pd.DateOffset用来精准计算需要扩展的后续月份,避免手动拼接日期的误差。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

