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

如何用Pandas获取时间序列中值超阈值的起止时间?

提取时间序列中值超阈值的起止时间段

需求说明

从时间序列数据中,找出Value列值≥150的连续时间段,输出包含起止时间及时长(秒)的DataFrame。

示例数据

原始数据:

Datetime    Value
0   11/30/2022 0:00 100
1   11/30/2022 0:01 110
2   11/30/2022 0:02 105
3   11/30/2022 0:03 105
4   11/30/2022 0:04 155
5   11/30/2022 0:05 160
6   11/30/2022 0:06 160
7   11/30/2022 0:07 160
8   11/30/2022 0:08 160
9   11/30/2022 0:09 165
10  11/30/2022 0:10 165
11  11/30/2022 0:11 160
12  11/30/2022 0:12 160
13  11/30/2022 0:13 150
14  11/30/2022 0:14 120
15  11/30/2022 0:15 110
16  11/30/2022 0:16 115
17  11/30/2022 0:17 115
18  11/30/2022 0:18 130
19  11/30/2022 0:19 145
20  11/30/2022 0:20 150
21  11/30/2022 0:21 155
22  11/30/2022 0:22 155
23  11/30/2022 0:23 155
24  11/30/2022 0:24 155
25  11/30/2022 0:25 155
26  11/30/2022 0:26 140
27  11/30/2022 0:27 130
28  11/30/2022 0:28 120

期望输出:

Start_Time          End_Time              Duration
0   2022-11-30 00:04:00 2022-11-30 00:13:00   540.0
1   2022-11-30 00:20:00 2022-11-30 00:25:00   300.0

解决方案

通过以下步骤实现:

  1. 转换时间格式:将字符串类型的Datetime列转为pandas时间类型,方便后续时间计算。
  2. 标记超阈值行:创建布尔列,标记Value≥150的行。
  3. 分组连续区间:利用cumsum对不满足阈值的行累加,将连续满足阈值的行划分为同一组。
  4. 提取起止时间:按分组聚合,取每组的第一个和最后一个时间作为起止时间。
  5. 计算时长:通过时间差计算时间段的秒数。

完整代码:

import pandas as pd

# 构造示例数据
data = {
    'Datetime': ['11/30/2022 0:00', '11/30/2022 0:01', '11/30/2022 0:02', '11/30/2022 0:03', '11/30/2022 0:04',
                 '11/30/2022 0:05', '11/30/2022 0:06', '11/30/2022 0:07', '11/30/2022 0:08', '11/30/2022 0:09',
                 '11/30/2022 0:10', '11/30/2022 0:11', '11/30/2022 0:12', '11/30/2022 0:13', '11/30/2022 0:14',
                 '11/30/2022 0:15', '11/30/2022 0:16', '11/30/2022 0:17', '11/30/2022 0:18', '11/30/2022 0:19',
                 '11/30/2022 0:20', '11/30/2022 0:21', '11/30/2022 0:22', '11/30/2022 0:23', '11/30/2022 0:24',
                 '11/30/2022 0:25', '11/30/2022 0:26', '11/30/2022 0:27', '11/30/2022 0:28'],
    'Value': [100, 110, 105, 105, 155, 160, 160, 160, 160, 165, 165, 160, 160, 150, 120, 110, 115, 115, 130, 145,
              150, 155, 155, 155, 155, 155, 140, 130, 120]
}

df = pd.DataFrame(data)

# 1. 转换Datetime列为时间类型
df['Datetime'] = pd.to_datetime(df['Datetime'], format='%m/%d/%Y %H:%M')

# 2. 标记Value≥150的行
df['above_threshold'] = df['Value'] >= 150

# 3. 创建分组标签,连续满足条件的行归为同一组
df['group'] = (~df['above_threshold']).cumsum()

# 4. 按分组提取起止时间
result = df[df['above_threshold']].groupby('group').agg(
    Start_Time=('Datetime', 'first'),
    End_Time=('Datetime', 'last')
).reset_index(drop=True)

# 5. 计算时长(秒)
result['Duration'] = (result['End_Time'] - result['Start_Time']).dt.total_seconds()

# 输出结果
print(result)

执行代码后即可得到期望的输出结果。

内容的提问来源于stack exchange,提问作者ledzed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:31:03