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

如何在移动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:55:15