使用pandas填充上次已知的timeseries数据

2024-04-29 05:33:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

简言之,我想知道如何转发fill timeseries数据,同时注意每个数据点的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,然后从有效的时间段df[start:end]切片数据帧,然后对我的前一个问题进行修复。你知道吗

然而,这导致了一个单独的子集,而不是我的“大”数据帧。我需要的是在我的“大数据框”上做这个操作,并且能够移动这个窗口并遍历所有的数据。你知道吗


Tags: 数据idpandasdatawith变体nan事情
2条回答

您可以^{}“id”列,然后调用^{}

In [95]:
df.groupby(['id'], as_index=False).ffill()

Out[95]:
             datetime  id     a   b    c     d
0 2014-07-24 17:49:00   5  1046  -3 -239  2800
1 2015-05-05 15:00:00   2   NaN NaN  NaN  2680
2 2015-05-05 15:00:00   3   989  20  -11  2680
3 2015-05-05 15:00:00   4  1022  60  -76  2600
4 2015-05-05 15:00:00   5  1046  -3 -239  2623

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

相关问题 更多 >