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

如何用Python Pandas计算IGN从开启到关闭的时长

计算Pandas DataFrame中IGN从On到Off的周期时长

给定包含IGN(状态:On/Off)和Time(时间戳)列的Pandas DataFrame,需要计算每个连续"On"周期的持续时长——即从周期内第一个"On"的时间到紧接着该周期的第一个"Off"的时间的差值。

初始化代码如下:

import pandas as pd
data = {'IGN': ['On', 'On', 'On', 'On', 'On', 'On', 'Off', 'Off', 'Off', 'On', 'Off', 'On', 'On', 'On', 'On', 'On', 'On', 'On', 'Off'], 'Time': ['08-06-2023 10:05:56 AM', '08-06-2023 10:06:49 AM', '08-06-2023 10:06:52 AM', '08-06-2023 10:07:08 AM', '08-06-2023 10:07:16 AM', '08-06-2023 10:07:19 AM', '08-06-2023 10:07:33 AM', '08-06-2023 10:07:56 AM', '08-06-2023 10:12:33 AM', '08-06-2023 10:13:55 AM', '08-06-2023 10:13:56 AM', '08-06-2023 10:14:07 AM', '08-06-2023 10:14:10 AM', '08-06-2023 10:14:13 AM', '08-06-2023 10:14:23 AM', '08-06-2023 10:14:31 AM', '08-06-2023 10:14:34 AM', '08-06-2023 10:14:37 AM', '08-06-2023 10:14:40 AM']}
df = pd.DataFrame(data)
df['Time'] = pd.to_datetime(df['Time'])

预期输出:

0   0 days 00:01:37
1   0 days 00:00:01
2   0 days 00:00:33
dtype: timedelta64[ns]

实现步骤

  • 标记连续状态分组:通过比较当前行与上一行的IGN状态,生成连续相同状态的分组ID。
  • 聚合分组信息:按分组ID聚合,提取每个分组的状态和第一个时间戳。
  • 配对On/Off组计算时长:将所有"On"分组与紧随其后的"Off"分组配对,计算时间差。

完整代码

# 1. 生成连续状态分组ID
df['group'] = df['IGN'].ne(df['IGN'].shift()).cumsum()

# 2. 聚合每个分组的状态和首个时间
group_summary = df.groupby('group').agg(
    status=('IGN', 'first'),
    first_time=('Time', 'first')
).reset_index()

# 3. 提取On分组和对应的Off分组时间,计算时长
on_groups = group_summary[group_summary['status'] == 'On']['first_time'].reset_index(drop=True)
off_groups = group_summary[group_summary['status'] == 'Off']['first_time'].reset_index(drop=True)

durations = off_groups - on_groups
print(durations)

代码说明

  • df['IGN'].ne(df['IGN'].shift()).cumsum():通过判断当前行与上一行状态是否不同,生成递增的分组ID,确保连续相同状态的行属于同一分组。
  • 聚合操作提取每个分组的首个时间戳,因为我们只需要每个"On"周期的起始时间和对应"Off"周期的起始时间。
  • 最后将On分组和Off分组的时间一一对应相减,得到每个"On"周期的持续时长。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:53:17