【问题标题】:Pandas resample and ffill leaves NaN at the endPandas 重新采样和填充最后留下 NaN
【发布时间】:2019-01-29 18:57:48
【问题描述】:

我想通过前向填充结果将一个系列从每周频率上采样到每天频率。

如果我原始系列的最后一次观察是NaN,我本来希望这个值被之前的有效值替换,但它仍然是NaN

设置

import numpy as np
import pandas as pd

all_dates = pd.date_range(start='2018-01-01', freq='W-WED', periods=4)

ts = pd.Series([1, 2, 3], index=all_dates[:3])
ts[all_dates[3]] = np.nan

ts
Out[16]: 
2018-01-03    1.0
2018-01-10    2.0
2018-01-17    3.0
2018-01-24    NaN
Freq: W-WED, dtype: float64

结果

ts.resample('B').ffill() 

ts.resample('B').ffill()
Out[17]: 
2018-01-03    1.0
2018-01-04    1.0
2018-01-05    1.0
2018-01-08    1.0
2018-01-09    1.0
2018-01-10    2.0
2018-01-11    2.0
2018-01-12    2.0
2018-01-15    2.0
2018-01-16    2.0
2018-01-17    3.0
2018-01-18    3.0
2018-01-19    3.0
2018-01-22    3.0
2018-01-23    3.0
2018-01-24    NaN
Freq: B, dtype: float64

虽然我预计最后一个值也是 3。

有人对这种行为有解释吗?

【问题讨论】:

标签: python pandas missing-data resampling


【解决方案1】:

resample() 返回DatetimeIndexResampler

您需要返回原来的熊猫Series

在填写Nanhttps://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.asfreq.html之前,您可以使用asfreq()方法来完成。

所以,这应该可行:

ts.resample('B').asfreq().ffill()

【讨论】:

    【解决方案2】:

    重采样点和ffill只是从一周的第一天开始向前传播——如果一周的第一天是NaN,那就是向前填充的内容。例如:

    ts.iloc[1] = np.nan
    ts.resample('B').ffill()
    
    2018-01-03    1.0
    2018-01-04    1.0
    2018-01-05    1.0
    2018-01-08    1.0
    2018-01-09    1.0
    2018-01-10    NaN
    2018-01-11    NaN
    2018-01-12    NaN
    2018-01-15    NaN
    2018-01-16    NaN
    2018-01-17    3.0
    2018-01-18    3.0
    2018-01-19    3.0
    2018-01-22    3.0
    2018-01-23    3.0
    2018-01-24    NaN
    Freq: B, dtype: float64
    

    在大多数情况下,从前一周的数据传播不是是理想的行为。如果您想在原始(每周)系列中缺少值的情况下使用前几周的数据,只需fillnaffill 一起使用。

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2016-11-02
      • 2013-07-17
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多