代码之家  ›  专栏  ›  技术社区  ›  Umar.H

将多个时间值分组为开始和结束时间

  •  1
  • Umar.H  · 技术社区  · 6 年前

    我有一个数据框架如下

    import pandas as pd
    import numpy as np
    IDs = ['A','A','A','B','B']
    times = pd.date_range(start='01/01/2019',end='01/02/2019',freq='h')
    times_2 = pd.date_range(start='01/01/2019',end='01/02/2019',freq='h') + pd.Timedelta('15min')
    
    Vals = [np.random.randint(15,250) for x in enumerate(times)]
    df = pd.DataFrame({'id' : IDs*5,
                 'Start' : times,
                 'End' : times_2,
                'Value' : Vals},columns=['id','Start','End','Value'])
    

    这给了我一个df,如下所示。

    print(df.head(5))
            id  Start   End Value
    0   A   2019-01-01 00:00:00 2019-01-01 00:15:00 52
    1   A   2019-01-01 01:00:00 2019-01-01 01:15:00 69
    2   A   2019-01-01 02:00:00 2019-01-01 02:15:00 209
    3   B   2019-01-01 03:00:00 2019-01-01 03:15:00 163
    4   B   2019-01-01 04:00:00 2019-01-01 04:15:00 70
    

    现在我要做的是申请 group by 但是,为了得到值列的总和,在执行此操作时,我希望保留df的最小开始时间和最大结束时间。

    所以我的输出示例如下:

      id    Start   End Value
    0   A   2019-01-01 00:00:00 2019-01-01 22:15:00 2007
    1   B   2019-01-01 03:00:00 2019-01-02 00:15:00 1385
    

    我做这项工作的唯一方法是按开始和结束时间传递每个唯一ID的最小值和最大值,将这些值传递到一个列表,然后手动创建开始和结束时间,但是它很慢,很混乱,而且容易出错…希望这里有人能指导我找到我所缺少的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   BENY    6 年前

    使用 groupby 具有 agg

    df.groupby('id').agg({'Start':'min','End':'max','Value':'sum'})#reset_index()
    Out[92]: 
                     Start                 End  Value
    id                                               
    A  2019-01-01 00:00:00 2019-01-01 22:15:00   2152
    B  2019-01-01 03:00:00 2019-01-02 00:15:00    972