如何按时间范围分组DatetimeIndex并计算每组的最小最大值?
问题描述
我有如下DatetimeIndex数据:
DatetimeIndex(['2021-01-18 01:32:00', '2021-01-18 01:33:00', '2021-01-18 01:34:00', '2021-01-18 01:35:00', '2021-01-18 01:36:00', '2021-01-18 01:37:00', '2021-12-16 12:07:00', '2021-12-16 12:08:00', '2021-12-16 12:09:00', '2021-12-16 12:10:00'], dtype='datetime64[ns]', length=10, freq=None)
需要将这些数据按连续时间范围分组,计算每个分组的最小和最大时间值,预期结果如下:
range range_min range_max 1 2021-01-18 01:32:00 2021-01-18 01:37:00 2 2021-12-16 12:07:00 2021-12-16 12:10:00
目前我只能计算全局的最小/最大值,代码如下:
import numpy as np import pandas as pd pd.DataFrame(my_timestamps,columns=["timestamp"]).agg({"timestamp" : [np.min, np.max]})
请问该如何实现按时间范围分组的需求?
解决方案
核心思路是识别时间序列中的间断点:当相邻时间戳的间隔超过设定阈值时,就划分一个新的分组。以下是具体实现:
实现步骤
- 将DatetimeIndex转换为DataFrame,方便后续处理
- 计算相邻时间戳的差值,判断是否超过阈值(这里用1分钟,因为你的连续数据是每分钟一条)
- 基于间断点生成连续的分组编号
- 按分组编号聚合,计算每个组的最小和最大时间
完整代码
import pandas as pd import numpy as np # 定义你的DatetimeIndex my_timestamps = pd.DatetimeIndex(['2021-01-18 01:32:00', '2021-01-18 01:33:00', '2021-01-18 01:34:00', '2021-01-18 01:35:00', '2021-01-18 01:36:00', '2021-01-18 01:37:00', '2021-12-16 12:07:00', '2021-12-16 12:08:00', '2021-12-16 12:09:00', '2021-12-16 12:10:00']) # 转为DataFrame df = pd.DataFrame(my_timestamps, columns=["timestamp"]) # 生成分组键:相邻时间差超过1分钟则标记为新分组 df['group'] = (df['timestamp'].diff() > pd.Timedelta(minutes=1)).cumsum() + 1 # 按分组聚合计算最小和最大时间 result = df.groupby('group')['timestamp'].agg(['min', 'max']).reset_index() # 重命名列以匹配预期结果 result.columns = ['range', 'range_min', 'range_max'] print(result)
输出结果
range range_min range_max 0 1 2021-01-18 01:32:00 2021-01-18 01:37:00 1 2 2021-12-16 12:07:00 2021-12-16 12:10:00
代码说明
df['timestamp'].diff():计算当前时间戳与上一个时间戳的差值,第一行结果为NaN> pd.Timedelta(minutes=1):判断时间差是否超过1分钟,超过则返回True(表示出现时间间断).cumsum():对布尔值累加(True视为1,False视为0),生成分组标识,最后+1让分组编号从1开始groupby('group').agg(['min', 'max']):按分组对时间戳列聚合,得到每个组的最小和最大时间
内容的提问来源于stack exchange,提问作者Fluxy
相关产品推荐
相关产品推荐

