如何用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
解决方案
通过以下步骤实现:
- 转换时间格式:将字符串类型的
Datetime列转为pandas时间类型,方便后续时间计算。 - 标记超阈值行:创建布尔列,标记
Value≥150的行。 - 分组连续区间:利用
cumsum对不满足阈值的行累加,将连续满足阈值的行划分为同一组。 - 提取起止时间:按分组聚合,取每组的第一个和最后一个时间作为起止时间。
- 计算时长:通过时间差计算时间段的秒数。
完整代码:
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
相关产品推荐
相关产品推荐

