大熊猫连续时间间隔的汇总和计数

时间:2020-09-29 15:08:26

标签: python pandas dataframe datetime

我想汇总连续的时间间隔,并为每个熊猫人计数。

作为一个例子,我有一个看起来像这样的数据框:

     Name      Time
0     Bob  10:59:00
1     Bob  11:00:00
2     Bob  11:01:00
3     Bob  11:14:00
4     Bob  11:15:00
5     Bob  11:17:00
6     Bob  11:18:00
7     Bob  11:19:00
8     Bob  13:10:00
9     Bob  13:10:00
10    Bob  13:15:00
11    Bob  13:16:00
12    Bob  13:17:00
13    Bob  13:18:00
14    Bob  13:19:00
15  Alice  13:17:00
16  Alice  13:18:00
17  Alice  13:19:00

具有以下输出:

注意:我只需要计数而不是时间间隔本身。

Bob = 5
1. 10:59 - 11:01
2. 11:14 - 11:15
3. 11:17 - 11:19
4. 13:10 - 13:10
5. 13:15 - 13:19

Alice = 1
1. 13:17 - 13:19

1 个答案:

答案 0 :(得分:1)

我假设您的 Time 列为 string 类型。

您可以使用以下代码:

result = df.groupby('Name', sort=False).apply(
    lambda grp: grp.groupby((pd.to_datetime(grp.Time).diff().dt
    .total_seconds() / 60).fillna(2).ge(2).cumsum())
    .Time.apply(lambda tt: f'{tt.iloc[0]} - {tt.iloc[-1]}'))\
    .rename_axis(['Name', 'Period'])

结果是:

Name   Period
Bob    1         10:59:00 - 11:01:00
       2         11:14:00 - 11:15:00
       3         11:17:00 - 11:19:00
       4         13:10:00 - 13:10:00
       5         13:15:00 - 13:19:00
Alice  1         13:17:00 - 13:19:00
Name: Time, dtype: object

上面的代码包含2级分组:

  • 第一级-通过名称
  • 第二级-按“句号”的编号-序列 时间值的连续性。

从每个第二级组中选出第一个 最后一次(用减号分隔)。

最后一部分是将索引中的列重命名为 更好地反映所显示数据的含义。

如果您希望打印出的外观几乎与我们的帖子中的样子完全相同,请运行:

for key, grp in result.groupby(level=0, sort=False):
    print(f'{key} = {grp.size}')
    print(f'{grp.reset_index(level=0, drop=True).rename_axis(None).to_string()}\n')

(尝试查看结果)。

这一次在句号之后没有点,但是我认为 这并不重要。