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

使用Python计算时间序列中事件的持续时长

计算时间序列中连续事件的持续时长

假设你定义的“事件”是连续的非零值时间段(如果需要计算连续零值的时长,后面会说明调整方法),我们可以用Pandas来高效实现这个需求,步骤如下:

1. 准备数据(确保时间索引格式正确)

首先需要确保DataFrame的索引是datetime类型,这样才能正确计算时间差。先构造你的示例数据并处理格式:

import pandas as pd

# 构造你提供的示例数据
data = {
    'index': ['2003-01-01 00:00:00', '2003-01-01 01:00:00', '2003-01-01 02:00:00',
              '2003-01-01 03:00:00', '2003-01-01 04:00:00', '2003-01-01 05:00:00',
              '2003-01-01 06:00:00', '2003-01-01 07:00:00', '2003-01-01 08:00:00',
              '2003-01-01 09:00:00', '2003-01-01 10:00:00', '2003-01-01 11:00:00',
              '2003-01-01 12:00:00', '2003-01-01 13:00:00', '2003-01-01 14:00:00',
              '2003-01-01 15:00:00', '2003-01-01 16:00:00', '2003-01-01 17:00:00',
              '2003-01-01 18:00:00'],
    'value': [14.5, 15.8, 0, 0, 13.6, 4.3, 13.7, 14.4, 0, 0, 0, 17.2, 0, 5.3, 0, 2.0, 4.0, 0, 0]
}

df = pd.DataFrame(data)
# 转换为datetime类型并设置为索引
df['index'] = pd.to_datetime(df['index'])
df.set_index('index', inplace=True)

2. 标记连续事件组

我们需要把连续的非零值归为同一个事件组,这里通过判断每行的非零状态是否和上一行变化来生成组号:

# 标记哪些行属于事件(非零值)
df['is_event'] = df['value'] != 0

# 生成事件组ID:当非零状态发生变化时,组号递增
df['event_group'] = df['is_event'].ne(df['is_event'].shift()).cumsum()

3. 计算每个事件的持续时长

通过分组聚合,我们可以得到每个事件的开始时间、结束时间,进而算出持续时长:

# 只保留事件行,按组聚合
event_groups = df[df['is_event']].groupby('event_group')

# 计算每个事件的关键信息
event_duration = event_groups.agg(
    start_time=('index', 'first'),
    end_time=('index', 'last'),
    duration=('index', lambda x: x.max() - x.min())
).reset_index(drop=True)

# 可选:把时长转换为小时,更直观
event_duration['duration_hours'] = event_duration['duration'].dt.total_seconds() / 3600

# 查看结果
print(event_duration)

运行后你会得到类似这样的结果:

start_time           end_time duration  duration_hours
0 2003-01-01 00:00:00 2003-01-01 01:00:00  0 days 01:00:00             1.0
1 2003-01-01 04:00:00 2003-01-01 07:00:00  0 days 03:00:00             3.0
2 2003-01-01 11:00:00 2003-01-01 11:00:00  0 days 00:00:00             0.0
3 2003-01-01 13:00:00 2003-01-01 13:00:00  0 days 00:00:00             0.0
4 2003-01-01 15:00:00 2003-01-01 16:00:00  0 days 01:00:00             1.0

调整:计算连续零值的时长

如果你的需求是计算连续零值的时间段时长,只需要修改is_event的判断逻辑:

# 标记零值行
df['is_event'] = df['value'] == 0

之后的步骤完全一致,就能得到连续零值事件的持续时长了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:40:45