Python使用线性插值对不规则时间序列进行正则化
我在pandas中有一个时序如下:
Values
1992-08-27 07:46:48 28.0
1992-08-27 08:00:48 28.2
1992-08-27 08:33:48 28.4
1992-08-27 08:43:48 28.8
1992-08-27 08:48:48 29.0
1992-08-27 08:51:48 29.2
1992-08-27 08:53:48 29.6
1992-08-27 08:56:48 29.8
1992-08-27 09:03:48 30.0
我想将其重新采样为具有15分钟时间步长的常规时间序列,其中值是线性插值的。基本上我想得到:
Values
1992-08-27 08:00:00 28.2
1992-08-27 08:15:00 28.3
1992-08-27 08:30:00 28.4
1992-08-27 08:45:00 28.8
1992-08-27 09:00:00 29.9
但是使用熊猫的重采样方法(df.resample(‘15Min’))我得到:
Values
1992-08-27 08:00:00 28.20
1992-08-27 08:15:00 NaN
1992-08-27 08:30:00 28.60
1992-08-27 08:45:00 29.40
1992-08-27 09:00:00 30.00
我尝试使用不同的“ how”和“ fill_method”参数进行重采样方法,但从未获得我想要的结果。我使用了错误的方法吗?
我认为这是一个相当简单的查询,但我在网上搜索了一段时间,却找不到答案。
在此先感谢您能获得的任何帮助。
-
这需要一些工作,但是请尝试一下。基本思想是找到与每个重采样点最近的两个时间戳并进行插值。
np.searchsorted
用于查找最接近重采样点的日期。# empty frame with desired index rs = pd.DataFrame(index=df.resample('15min').iloc[1:].index) # array of indexes corresponding with closest timestamp after resample idx_after = np.searchsorted(df.index.values, rs.index.values) # values and timestamp before/after resample rs['after'] = df.loc[df.index[idx_after], 'Values'].values rs['before'] = df.loc[df.index[idx_after - 1], 'Values'].values rs['after_time'] = df.index[idx_after] rs['before_time'] = df.index[idx_after - 1] #calculate new weighted value rs['span'] = (rs['after_time'] - rs['before_time']) rs['after_weight'] = (rs['after_time'] - rs.index) / rs['span'] # I got errors here unless I turn the index to a series rs['before_weight'] = (pd.Series(data=rs.index, index=rs.index) - rs['before_time']) / rs['span'] rs['Values'] = rs.eval('before * before_weight + after * after_weight')
毕竟,希望正确的答案是:
In [161]: rs['Values'] Out[161]: 1992-08-27 08:00:00 28.011429 1992-08-27 08:15:00 28.313939 1992-08-27 08:30:00 28.223030 1992-08-27 08:45:00 28.952000 1992-08-27 09:00:00 29.908571 Freq: 15T, Name: Values, dtype: float64