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

如何按时间范围分组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:55:31