代码之家  ›  专栏  ›  技术社区  ›  user96564

如果两个日期之间的间隔超过某些特定条件,请停止在熊猫中重新取样

  •  0
  • user96564  · 技术社区  · 6 年前

    我有这个数据框。我的数据帧包含id、时间和值以及间隔(hr)。我独立于每个IDS进行重新采样。间隙列给出了两个不同时间之间的连续时间间隔。我每隔10分钟做一次重新取样,如果连续间隙大于0.86小时,我想停止重新取样,然后返回下一行作为原始,当发现相同的条件时继续重新取样。 我的间隙条件适合这样

    a (abs(a-b))
    b  0
    

    样本数据

    ID,Time,Value,Gaps
    1,1523147332607,2,0.3347541666666667
    1,1523148537722,5,0.17346666666666666
    1,1523149162202,6,1.6252830555555555
    1,1523155013221,4,0.33290027777777775
    1,1523156211662,7,0.3722580555555556
    1,1523157551791,10,0.0
    2,1523156211662,5,0.5115911111111111
    2,1523158053390,2,0.3405525
    2,1523159279379,9,1.3295477777777778
    2,1523164065751,3,0.0
    

    正如你所看到的,ID 1有超过0.86小时的差距,所以我的想法是停止再采样在这一点上。 像这样的东西

    ID,Time,Value,Gaps
    1,1523147332607,2,0.3347541666666667
    ...................................
    1,1523148537722,5,0.17346666666666666
    ...................................
    ...................................
    1,1523149162202,6,1.6252830555555555
    

    所以,我想继续重新采样到这个 Time period 1523149162202 当没有更多的采样要做时,我想将最后一行作为原始行返回,即

    1,1523149162202,6,1.6252830555555555
    

    之后,我想继续从下一行重新采样。

    1,1523155013221,4,0.33290027777777775
    1,1523156211662,7,0.3722580555555556
    1,1523157551791,10,0.0
    

    这种情况还在继续

    对于每个IDS的正常重采样,

     df = df.set_index(['Time'])
     df.index = pd.to_datetime(df.index, unit='ms')
    
     df = (df.groupby('ID', axis=0)['Value']
           .resample('10min')
            .mean()
            .groupby(level=0)
            .apply(lambda x: x.interpolate()).reset_index())
    

    但我如何跟踪每次重新采样,以便在满足某些条件时停止重新采样,并返回该部分重采样端的原始行。然后从下一行继续同样的标准。我想用 np.where 但我根本不可能做到这一点。 有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ben.T    6 年前

    一种方法是在 df ,当您更改id或在间隙超过0.86后的行处递增数字,例如:

    df.loc[(df['ID'] != df['ID'].shift())| (df['Gaps'].shift() > 0.86),'ID_res'] = 1
    df['ID_res'] = df['ID_res'].cumsum().ffill()
    

    所以你的DF看起来像:

                             ID  Value      Gaps  ID_res
    Time                                                
    2018-04-08 00:28:52.607   1      2  0.334754     1.0
    2018-04-08 00:48:57.722   1      5  0.173467     1.0
    2018-04-08 00:59:22.202   1      6  1.625283     1.0
    2018-04-08 02:36:53.221   1      4  0.332900     2.0
    2018-04-08 02:56:51.662   1      7  0.372258     2.0
    2018-04-08 03:19:11.791   1     10  0.000000     2.0
    2018-04-08 02:56:51.662   2      5  0.511591     3.0
    2018-04-08 03:27:33.390   2      2  0.340553     3.0
    2018-04-08 03:47:59.379   2      9  1.329548     3.0
    2018-04-08 05:07:45.751   2      3  0.000000     4.0
    

    现在,您可以使用给定的方法对“id\u res”执行第一个groupby,同时保留列“id”和“value”,并在不再需要时在末尾删除列“id\u res”:

    df = (df.groupby('ID_res', axis=0)['ID','Value'].resample('10min').mean()
            .groupby(level=0).apply(lambda x: x.interpolate())
            .reset_index().drop('ID_res',1))
    

    结果如下:

                      Time   ID  Value
    0  2018-04-08 00:20:00  1.0    2.0
    1  2018-04-08 00:30:00  1.0    3.5
    2  2018-04-08 00:40:00  1.0    5.0
    3  2018-04-08 00:50:00  1.0    6.0
    4  2018-04-08 02:30:00  1.0    4.0
    5  2018-04-08 02:40:00  1.0    5.5
    6  2018-04-08 02:50:00  1.0    7.0
    ...
    

    在第3行和第4行之间没有重新采样的情况下,原始值中的“间隙”超过0.86。 数据框