首页 > 解决方案 > 用前几年的值替换时间序列缺失值

问题描述

正如标题所示,我每小时的 df 看起来像这样:

                        date_time               traffic_volume
date_time       
2012-10-02 09:00:00     2012-10-02 09:00:00     5545.0
2012-10-02 10:00:00     2012-10-02 10:00:00     4516.0
2012-10-02 11:00:00     2012-10-02 11:00:00     NaN
2012-10-02 12:00:00     2012-10-02 12:00:00     NaN
2012-10-02 13:00:00     2012-10-02 13:00:00     NaN
2012-10-02 14:00:00     2012-10-02 14:00:00     NaN
2012-10-02 15:00:00     2012-10-02 15:00:00     5584.0
2012-10-02 16:00:00     2012-10-02 16:00:00     6015.0

我使用的大多数 NaN

df['traffic_volume'] = df['traffic_volume'].interpolate(method='time')

现在的问题是,对于时间序列的某个子集(剩余的 NaN),我想通过输入与去年相同的那一天的值来进行估算。我用了

df['traffic_volume'] =  df.apply(lambda x: df.loc[ x['date_time'] + pd.offsets.DateOffset(years=-1)]['traffic_volume'] if x['traffic_volume']==np.NaN else x['traffic_volume'], axis=1)

代码行运行了,但我的 NaN 没有被估算。我的问题是为什么?如果有更好的方法是什么?

谢谢你。

PS我不想使用bfill,ffill或interpolate的原因是因为NaN的序列太多并且数据失去了粒度。

标签: python-3.xpandastime-series

解决方案


修复方法是使用pd.isna(x['traffic'])而不是x['traffic_volume']==np.NaNfor 中的if条件lambda。我仍然不明白为什么初始行运行但没有估算。


推荐阅读