如何使用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
相关产品推荐
相关产品推荐

