考虑使用 interpolate
(Series-DataFrame)。该示例展示了如何使用直线填补任意大小的间隙:
df = pd.DataFrame({'date': pd.date_range(start='2013-01-01', periods=10, freq='H'), 'value': range(10)})
df.loc[2:3, 'value'] = np.nan
df.loc[6, 'value'] = np.nan
df
date value
0 2013-01-01 00:00:00 0.0
1 2013-01-01 01:00:00 1.0
2 2013-01-01 02:00:00 NaN
3 2013-01-01 03:00:00 NaN
4 2013-01-01 04:00:00 4.0
5 2013-01-01 05:00:00 5.0
6 2013-01-01 06:00:00 NaN
7 2013-01-01 07:00:00 7.0
8 2013-01-01 08:00:00 8.0
9 2013-01-01 09:00:00 9.0
df['value'].interpolate(method='linear', inplace=True)
date value
0 2013-01-01 00:00:00 0.0
1 2013-01-01 01:00:00 1.0
2 2013-01-01 02:00:00 2.0
3 2013-01-01 03:00:00 3.0
4 2013-01-01 04:00:00 4.0
5 2013-01-01 05:00:00 5.0
6 2013-01-01 06:00:00 6.0
7 2013-01-01 07:00:00 7.0
8 2013-01-01 08:00:00 8.0
9 2013-01-01 09:00:00 9.0
method ='time'
而不是 method ='linear'
。 - Mohammad ElNesrmethod='time'
的信息。我使用线性进展 range(10)
作为简单的示例,但任何值序列都可以用来证明,如果日期系列像原始问题中一样均匀间隔,那么 method='linear'
和 method='time'
之间没有区别。 - Peter Leimbigler插值和Filna:
由于这是时间序列问题,我将在答案中使用输出图像进行解释:
假设我们拥有以下时间序列数据:(x轴表示天数,y轴表示数量)
pdDataFrame.set_index('Dates')['QUANTITY'].plot(figsize = (16,6))
我们可以看到时间序列中有一些NaN数据。NaN的百分比为19.4%。现在我们想要填补空缺/NaN值。
我将尝试展示插值和filna方法填充数据中的NaN值的输出。
interpolate() :
首先,我们将使用插值方法:
pdDataFrame.set_index('Dates')['QUANTITY'].interpolate(method='linear').plot(figsize = (16,6))
注意:这里的插值方法中没有时间方法。pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=None, downcast=None).plot(figsize = (16,6))
使用后向填充方法和 limit = 7 进行 fillna() 填充
limit:这是连续 NaN 值的最大数量,用于进行向前或向后填充。换句话说,如果存在具有超过此连续 NaN 数量的间隙,则只会部分填充。
pdDataFrame.set_index('Dates')['QUANTITY'].fillna(value=None, method='backfill', axis=None, limit=7, downcast=None).plot(figsize = (16,6))
我发现fillna函数更有用。但您可以使用这些方法中的任何一个来填充两个列中的nan值。rolling
:frame = pd.DataFrame({'Humidity':np.arange(50,64)})
frame.loc[[3,7,10,11],'Humidity'] = np.nan
frame.Humidity.fillna(frame.Humidity.rolling(4,min_periods=1).mean())
输出:
0 50.0
1 51.0
2 52.0
3 51.0
4 54.0
5 55.0
6 56.0
7 55.0
8 58.0
9 59.0
10 58.5
11 58.5
12 62.0
13 63.0
Name: Humidity, dtype: float64
看起来你的数据是按小时计算的。要不就取前一小时和后一小时的平均值?或者将窗口大小改为2,即前后两个小时的平均值?
使用其他变量进行插补可能会很昂贵,只有在虚拟方法效果不佳(例如引入太多噪音)时才应考虑这些方法。