【问题标题】:How can I calculate sum by overlapping time intervals by grouping each name?如何通过对每个名称进行分组来重叠时间间隔来计算总和?
【发布时间】:2023-01-19 18:40:53
【问题描述】:

如何通过对每个名称进行分组来重叠时间间隔来计算总和。如果该组名,则基本上较小的间隔应该与较大的间隔合并。

输入

df1 = (pd.DataFrame({'name': ['a', 'a', 'a', 'b', 'b'],
              'time_start': ['2000-01-01 00:01:12',
                            '2000-01-01 00:01:14',
                            '2000-01-01 00:03:12',
                            '2000-01-01 00:05:12',
                            '2000-01-01 00:05:16'],
              'time_end': ['2000-01-01 00:01:18',
                            '2000-01-01 00:01:16',
                            '2000-01-01 00:03:24',
                            '2000-01-01 00:05:40',
                            '2000-01-01 00:05:18'],
                    'values':[20,30,40,20,5]})
 .assign(time_start = lambda x: pd.to_datetime(x['time_start']),
        time_end = lambda x: pd.to_datetime(x['time_end'])))

输出应该是

name    time_start  time_end    values
0   a   2000-01-01 00:01:12 2000-01-01 00:01:18 50
1   a   2000-01-01 00:03:12 2000-01-01 00:03:24 40
2   b   2000-01-01 00:05:12 2000-01-01 00:05:40 25

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您可以使用 groupby.shift 然后使用 groupby.agg

    df1[['time_start', 'time_end']] = df1[['time_start', 'time_end']].apply(pd.to_datetime)
    
    g = df1['time_start'].lt(df1.groupby('name')['time_end'].shift()).cumsum()
    
    out = (df1.groupby(['name', g], as_index=False)
              .agg({'time_start': 'first', 'time_end': 'last',
                    'values': 'sum'})
          )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多