我想汇总连续的时间间隔,并为每个熊猫人计数。
作为一个例子,我有一个看起来像这样的数据框:
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
答案 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')
(尝试查看结果)。
这一次在句号之后没有点,但是我认为 这并不重要。