Python使用线性插值对不规则时间序列进行正则化

发布于 2021-01-29 18:35:32

我在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”参数进行重采样方法,但从未获得我想要的结果。我使用了错误的方法吗?

我认为这是一个相当简单的查询,但我在网上搜索了一段时间,却找不到答案。

在此先感谢您能获得的任何帮助。

关注者
0
被浏览
156
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这需要一些工作,但是请尝试一下。基本思想是找到与每个重采样点最近的两个时间戳并进行插值。 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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看