如何提取Pandas时间列中连续15分钟间隔时段的首尾时间
提取Pandas时间列中连续15分钟间隔子集的首尾时间
需求说明
给定Pandas的Time列(格式为HH:MM:SS),需要提取所有连续且相邻间隔严格为15分钟的时间序列子集,返回每个子集的首尾时间组成的字典列表。示例如下:
示例1
输入时间列:
| Time |
|---|
| 7:00:00 |
| 7:15:00 |
| 7:30:00 |
| 8:00:00 |
| 8:15:00 |
| 8:30:00 |
| 8:45:00 |
输出结果:
[{"start_time": "7:00:00", "end_time": "7:30:00"}, {"start_time": "8:00:00", "end_time": "8:45:00"}]
示例2
输入时间列:
| Time |
|---|
| 7:00:00 |
| 7:15:00 |
| 7:30:00 |
输出结果:
[{"start_time": "7:00:00", "end_time": "7:30:00"}]
示例3
输入时间列:
| Time |
|---|
| 7:00:00 |
| 7:15:00 |
| 7:30:00 |
| 8:00:00 |
| 9:00:00 |
| 10:00:00 |
| 10:15:00 |
| 10:30:00 |
| 11:00:00 |
输出结果:
[{"start_time": "7:00:00", "end_time": "7:30:00"}, {"start_time": "10:00:00", "end_time": "10:30:00"}]
解决方案
以下是实现该需求的Pandas代码步骤:
步骤1:准备数据与导入依赖
import pandas as pd # 以示例1数据为例构造DataFrame df = pd.DataFrame({ 'Time': ["7:00:00", "7:15:00", "7:30:00", "8:00:00", "8:15:00", "8:30:00", "8:45:00"] })
步骤2:转换时间列类型
将Time列转换为可计算的时间类型:
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S').dt.time
步骤3:生成分组标签
计算相邻时间的差值,标记出间隔非15分钟的位置,以此生成连续序列的分组ID:
# 计算相邻时间的分钟差 time_diff = df['Time'].diff().apply(lambda x: x.total_seconds() / 60) # 生成分组ID,间隔非15分钟时开启新分组 df['group_id'] = (time_diff != 15).cumsum()
步骤4:分组聚合首尾时间
按分组ID聚合,提取每组的首尾时间并转换为目标格式:
# 分组获取每组首尾时间 result_df = df.groupby('group_id')['Time'].agg(['first', 'last']) # 转换为要求的字典列表 result = result_df.apply(lambda row: { 'start_time': row['first'].strftime('%H:%M:%S'), 'end_time': row['last'].strftime('%H:%M:%S') }, axis=1).tolist() print(result)
运行结果(示例1)
[{"start_time": "7:00:00", "end_time": "7:30:00"}, {"start_time": "8:00:00", "end_time": "8:45:00"}]
替换初始df的数据源即可适配另外两个示例,得到对应结果。
内容的提问来源于stack exchange,提问作者Brayan Muñoz
相关产品推荐
相关产品推荐

