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

Pandas 2.2:PeriodIndex重采样警告及ffill填充的正确实现

在Pandas 2.2中处理PeriodIndex重采样并ffill的正确方式

直接将PeriodIndex转为DatetimeIndex后resample不符合预期,是因为年周期的Period转timestamp默认是周期起始点(如Y-DEC的2022年对应2022-01-01),单独这个时间点resample到月只会生成1月的数据,无法覆盖全年12个月。以下是两种可靠的解决方案:

方法一:先通过PeriodIndex的asfreq扩展频率,再转DatetimeIndex

先利用PeriodIndex的频率转换能力,把年周期扩展为月周期,再转为DatetimeIndex并填充缺失值:

import pandas as pd

df = pd.DataFrame.from_dict({"something": {pd.Period("2022", "Y-DEC"): 2.5}})
# 将年PeriodIndex扩展为月频率,空值暂时留空
df = df.asfreq("M")
# 转为DatetimeIndex
df.index = df.index.to_timestamp()
# 用ffill填充所有缺失值
df = df.ffill()
print(df)

执行结果会和原PeriodIndex resample的输出一致,得到全年12个月的数据。

方法二:基于Period的时间范围生成完整索引再重采样

如果需要保留DatetimeIndex的操作逻辑,可以先提取Period的起止时间,生成对应月份的完整索引,再通过reindex扩展并填充:

import pandas as pd

df = pd.DataFrame.from_dict({"something": {pd.Period("2022", "Y-DEC"): 2.5}})
# 提取唯一的Period对象
target_period = df.index[0]
# 生成该Period覆盖的所有月份的DatetimeIndex
full_month_idx = pd.date_range(
    start=target_period.start_time,
    end=target_period.end_time,
    freq="M"
)
# 转为DatetimeIndex
df.index = df.index.to_timestamp()
# 重索引到完整月份并ffill填充
df = df.reindex(full_month_idx).ffill()
print(df)

这两种方法都能替代原有的PeriodIndex resample逻辑,避免FutureWarning的同时得到预期结果。如果需要批量处理多处PeriodIndex,可以把逻辑封装成函数重复调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:27:35