如何用Pandas按Event组计算包含3行及以上的最短时间间隔?
问题描述
给定如下Pandas DataFrame:
import pandas as pd data = { "timeStamp": ['06:00:00', '06:03:00', '06:10:00', '06:30:00', '06:32:00', '06:02:00', '06:05:00', '06:06:00', '06:55:00', '06:00:00', '06:01:00', '06:20:00', '07:00:00'], "Event": ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'D'] } df = pd.DataFrame(data)
需求:按每个Event分组,找出包含3行及以上数据的最短时间间隔。示例结果说明:
- Event "A"的最短间隔为10分钟(从06:00:00到06:10:00)
- Event "B"的最短间隔为4分钟(从06:02:00到06:06:00)
- Event "C"的最短间隔为20分钟(从06:00:00到06:20:00)
- Event "D"不存在符合条件的间隔
期望输出:
| Event | Interval |
|---|---|
| A | 00:10:00 |
| B | 00:04:00 |
| C | 00:20:00 |
| D | NA |
解决方案
利用Pandas的时间运算、分组和滑动窗口特性,可以优雅实现需求,步骤如下:
- 转换时间格式:将字符串时间转为
datetime类型,便于计算时间差 - 分组处理:按
Event分组,对每组内的时间排序 - 滑动窗口计算间隔:用窗口大小为3的滑动窗口,计算每组内连续3条数据的首尾时间差
- 提取最小间隔:对每组的时间差取最小值,数据不足3条的标记为
NA - 格式化输出:将时间差转为
HH:MM:SS格式
具体代码实现:
import pandas as pd # 1. 转换时间列为datetime类型 df['timeStamp'] = pd.to_datetime(df['timeStamp'], format='%H:%M:%S') def get_min_interval(group): # 组内数据不足3条,返回空值 if len(group) < 3: return pd.NaT # 对时间排序 sorted_times = group.sort_values() # 滑动窗口计算连续3条数据的首尾时间差 intervals = sorted_times.rolling(window=3).apply(lambda x: x.iloc[-1] - x.iloc[0], raw=False) # 取非空的最小间隔 return intervals.min() # 分组计算最小间隔 result = df.groupby('Event')['timeStamp'].apply(get_min_interval).reset_index(name='Interval') # 格式化时间差为HH:MM:SS,空值替换为NA result['Interval'] = result['Interval'].apply(lambda x: x.strftime('%H:%M:%S') if pd.notna(x) else 'NA') print(result)
运行输出:
Event Interval 0 A 00:10:00 1 B 00:04:00 2 C 00:20:00 3 D NA
实现优势
- 用
rolling(window=3)替代手动循环,代码简洁且性能高效 - 原生支持时间差计算,无需额外处理时间转换逻辑
- 自动处理数据量不足的边界情况,结果统一规范
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

