【问题标题】:filling last known timeseries data using pandas使用 pandas 填充最后已知的时间序列数据
【发布时间】:2015-06-09 22:03:55
【问题描述】:

这是我提出的类似问题的变体: 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,然后从该有效时间段df[start:end] 中分割数据帧,然后修复我之前的问题。

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以groupby'id'栏,然后调用ffill:

    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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2020-10-07
        • 2021-04-20
        • 2015-11-21
        • 1970-01-01
        • 2018-07-24
        • 2021-11-12
        • 1970-01-01
        • 2017-11-27
        • 2020-03-19
        相关资源
        最近更新 更多