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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:04:23