You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas聚合并统计每位用户的连续时间区间数量

解决Pandas聚合连续时间区间并统计用户区间数量的问题

没问题,这是个常见的时间序列分组统计需求,我会一步步带你实现:

步骤1:准备示例数据

首先我们先构造你给出的示例DataFrame:

import pandas as pd

data = {
    'Name': ['Bob']*14 + ['Alice']*3,
    'Time': [
        '10:59:00', '11:00:00', '11:01:00', '11:14:00', '11:15:00',
        '11:17:00', '11:18:00', '11:19:00', '13:10:00', '13:10:00',
        '13:15:00', '13:16:00', '13:17:00', '13:18:00', '13:19:00',
        '13:17:00', '13:18:00', '13:19:00'
    ]
}
df = pd.DataFrame(data)

步骤2:转换时间格式并排序

要计算时间差,必须先把字符串类型的时间转成datetime格式,同时确保每个用户的时间是按顺序排列的:

# 转换Time列为datetime类型
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S')

# 按用户分组并对时间排序,保证时间顺序正确
df_sorted = df.groupby('Name')['Time'].apply(lambda x: x.sort_values()).reset_index(drop=True, level=1).reset_index()

步骤3:识别连续时间区间

我们通过计算相邻时间的差值,来判断是否属于同一个连续区间(这里定义连续为相邻时间间隔≤1分钟,完全匹配你的示例逻辑):

# 计算相邻时间的差值,单位转换为分钟
df_sorted['time_diff'] = df_sorted.groupby('Name')['Time'].diff().dt.total_seconds() / 60

# 标记新区间的起点:当差值>1分钟,或者是该用户的第一条记录时,标记为新区间
df_sorted['is_new_interval'] = df_sorted.groupby('Name')['time_diff'].apply(lambda x: x.isna() | (x > 1)).astype(int)

# 累加标记值,得到每个连续区间的唯一ID
df_sorted['interval_id'] = df_sorted.groupby('Name')['is_new_interval'].cumsum()

步骤4:统计每个用户的连续区间数量

最后统计每个用户的唯一区间ID数量,就是我们要的结果:

result = df_sorted.groupby('Name')['interval_id'].nunique()

# 打印结果
print(result)

运行后会输出:

Name
Alice    1
Bob      5
Name: interval_id, dtype: int64

补充说明

如果你的“连续”定义需要调整(比如允许更大的时间间隔),只需要修改x > 1中的数值即可——比如如果允许间隔≤5分钟算连续,就改成x > 5。

内容的提问来源于stack exchange,提问作者Ibrahim Sherif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:02:50