如何用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
相关产品推荐
相关产品推荐

