使用pandas填充最后已知的时间序列数据

时间:2015-06-09 10:27:16

标签: python pandas

这是我提出的类似问题的变体: filling last known data with pandas

简而言之,我想知道如何转发填充时间序列数据,同时注意每个数据点的ID。

麦角, 此

2014-07-24 17:49:00   5   1046.0   -3.0   -239.0   2800.0
...
2015-05-05 15:00:00   2     NaN     NaN     NaN    2680 
2015-05-05 15:00:00   3     0989      0020     -0011    2680
2015-05-05 15:00:00   4    1022      0060     -0076    2600 
2015-05-05 15:00:00   5     NaN     NaN     NaN    2623 

变为

2015-05-05 15:00:00   2     NaN     NaN     NaN    2680 
2015-05-05 15:00:00   3     0989      0020     -0011    2680
2015-05-05 15:00:00   4    1022      0060     -0076    2600 
2015-05-05 15:00:00   5     1046     -3.0     -239.0    2623

注意ID = 5的最后已知数据来自2014-07-24 17:49:00

现在的变化是做同样的事情,只是它应该考虑数据的“有效期”。我尝试做的是分配一个datetimeIndex,然后从该vaild时间段df[start:end]切片数据帧,然后对我之前的问题进行修复。

然而,这导致了一个单独的子集而不是我的“大”数据帧。我需要的是在我的“大数据帧”上进行操作,并能够移动这个窗口并浏览所有数据。

2 个答案:

答案 0 :(得分:1)

您可以groupby' id'列然后调用ffill

System.Windows.Controls.Grid

答案 1 :(得分:0)

Pandas有一个TimeGrouper object可以帮助您对具有。的数据框进行分组 DatetimeIndex按时间间隔。 Groupby operations can then be nested进一步按'id'分组:

import numpy as np
import pandas as pd

df = pd.DataFrame([['2014-07-24 17:49:00', 5, 1046.0, -3, -239, 2800],
                   ['2015-05-05 15:00:00', 2, np.nan, np.nan,np.nan, 2680],
                   ['2015-05-05 15:00:00', 3,  989, 20, -11, 2680], 
                   ['2015-05-05 15:00:00', 4, 1022, 60, -76, 2600], 
                   ['2015-05-05 15:00:00', 5, np.nan, np.nan, np.nan, 2623]], 
                  columns='timestamp id A B C D'.split())
df['timestamp'] = pd.DatetimeIndex(df['timestamp'])
df = df.set_index(['timestamp'])

print(df.groupby(pd.TimeGrouper('300D'), group_keys=False)
      .apply(lambda grp: grp.set_index(['id'], append=True)
             .groupby(level='id').ffill()))

产量

                           A   B    C     D
timestamp           id                     
2014-07-24 17:49:00 5   1046  -3 -239  2800
2015-05-05 15:00:00 2    NaN NaN  NaN  2680
                    3    989  20  -11  2680
                    4   1022  60  -76  2600
                    5   1046  -3 -239  2623