Python实现DataFrame列独立开机事件计数与运行时长统计
Python实现设备开机事件统计
核心逻辑
连续相同的On状态算1次独立开机事件,实现的核心是给连续同状态的记录分配唯一分组ID,再基于分组做聚合统计:
- 先将日期、时间字段合并为标准时间格式,用于时长计算
- 通过状态变化生成分组标记:当前行状态和上一行不一致时,分组ID递增,相同则继承上一行分组ID
- 筛选状态为
On的分组,统计分组总数得到独立开机次数 - 对每个
On分组,匹配对应的结束时间(分组后第一条非On状态的记录时间,若为数据集末尾的On分组则取最后一条记录时间),计算持续时长
完整实现代码
import pandas as pd # ---------------------- 1. 加载数据 替换为你自己的DataFrame即可 ---------------------- # 此处用题目给出的样例数据做演示 data = [ ["01/01/2022", "11:12:12.567", "Off"], ["01/01/2022", "11:22:12.567", "Off"], ["01/01/2022", "11:32:12.567", "Off"], ["01/01/2022", "11:42:12.567", "On"], ["01/01/2022", "11:52:12.567", "On"], ["01/01/2022", "12:02:12.567", "Off"], ["01/01/2022", "12:12:12.567", "Off"], ["01/01/2022", "12:22:12.567", "On"], ["01/01/2022", "12:32:12.567", "On"], ["01/01/2022", "12:42:12.567", "On"], ["01/01/2022", "12:52:12.567", "Off"], ] df = pd.DataFrame(data, columns=["Date", "Time", "State"]) # ---------------------- 2. 数据预处理 ---------------------- # 合并日期时间为标准datetime格式 df["datetime"] = pd.to_datetime(df["Date"] + " " + df["Time"], format="%d/%m/%Y %H:%M:%S.%f") # 按时间升序排序,避免数据乱序导致统计错误 df = df.sort_values("datetime").reset_index(drop=True) # ---------------------- 3. 生成连续状态分组ID ---------------------- # 状态变化时标记为True,累加生成分组ID df["group_id"] = (df["State"] != df["State"].shift(1)).cumsum() # ---------------------- 4. 统计开机事件 ---------------------- # 先按分组聚合,得到每个分组的状态、开始时间 group_res = df.groupby("group_id").agg( state=("State", "first"), start_time=("datetime", "min") ).reset_index() # 取每个分组的下一个分组的开始时间作为当前分组的结束时间,最后一个分组用数据集最大时间填充 group_res["end_time"] = group_res["start_time"].shift(-1, fill_value=df["datetime"].max()) # 筛选出开机(On)的事件 on_events = group_res[group_res["state"] == "On"].reset_index(drop=True) # 计算持续时长 on_events["duration"] = on_events["end_time"] - on_events["start_time"] # 格式化时间区间方便查看 on_events["time_range"] = on_events.apply( lambda x: f"[{x['start_time'].strftime('%H:%M')}-{x['end_time'].strftime('%H:%M')}]", axis=1 ) # ---------------------- 5. 输出结果 ---------------------- print(f"独立开机事件总次数:{len(on_events)}") print("各次开机事件详情:") print(on_events[["time_range", "duration"]])
样例运行结果
对应题目给出的测试数据,运行后输出结果和预期完全一致:
独立开机事件总次数:2 各次开机事件详情: time_range duration 0 [11:42-12:02] 0 days 00:20:00 1 [12:22-12:52] 0 days 00:30:00
注意事项
- 实际使用时替换构造样例数据的部分为你自己的DataFrame即可,字段名保持一致就能直接运行
- 代码默认数据已经覆盖所有状态采集点,如果存在数据缺失需要结合业务补全逻辑
- 时间格式如果和样例不一致,修改
pd.to_datetime里的format参数匹配你的实际时间格式即可
内容的提问来源于stack exchange,提问作者syed abdul
相关产品推荐
相关产品推荐

