首页 > 解决方案 > 最后一次观察一年后的前向填充列

问题描述

我使用以下 df 转发填充值:

df = (df.resample('d') # ensure data is daily time series
 .ffill()
 .sort_index(ascending=True)) 

df before forward fill

id                 a          b          c          d
datadate                                              
1980-01-31        NaN        NaN        NaN        NaN
1980-02-29        NaN         2         NaN        NaN
1980-03-31        NaN        NaN        NaN        NaN
1980-04-30         1         NaN         3          4
1980-05-31        NaN        NaN        NaN        NaN
              ...        ...        ...        ...
2019-08-31        NaN        NaN        NaN        NaN
2019-09-30        NaN        NaN        NaN        NaN
2019-10-31        NaN        NaN        NaN        NaN
2019-11-30        NaN        NaN        NaN        NaN
2019-12-31        NaN        NaN        20         33

但是,我希望只在最后一次观察(日期是日期时间)之后的一年前向前填充,然后剩下的行只是 NaN。我不确定在此任务中引入此标准的最佳方法是什么。任何帮助都会很棒!

谢谢

标签: pythonpandasdataframedatetimeresampling

解决方案


如果我理解正确,您希望将 2019 年 12 月 31 日的值转发到下一年。尝试这个:

end_date = df.index.max()
new_end_date = end_date + pd.offsets.DateOffset(years=1)
new_index = df.index.append(pd.date_range(end_date, new_end_date, closed='right'))

df = df.reindex(new_index)
df.loc[end_date:, :] = df.loc[end_date:, :].ffill()

结果:

              a    b     c     d
1980-01-31  NaN  NaN   NaN   NaN
1980-02-29  NaN  2.0   NaN   NaN
1980-03-31  NaN  NaN   NaN   NaN
1980-04-30  1.0  NaN   3.0   4.0
1980-05-31  NaN  NaN   NaN   NaN
2019-08-31  NaN  NaN   NaN   NaN
2019-09-30  NaN  NaN   NaN   NaN
2019-10-31  NaN  NaN   NaN   NaN
2019-11-30  NaN  NaN   NaN   NaN
2019-12-31  NaN  NaN  20.0  33.0
2020-01-01  NaN  NaN  20.0  33.0
2020-01-02  NaN  NaN  20.0  33.0
...
2020-12-31  NaN  NaN  20.0  33.0

推荐阅读