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

如何使用Python计算日志文件中设备ON到OFF状态的持续时长

解决方案

你的开发思路是完全可行的,用re模块匹配状态行提取时间和状态,用datetime模块处理时间计算差值,逻辑非常合理。

实现思路

  • 用正则表达式过滤出所有含Device State: ON/OFF的日志行,同时提取时间字符串和设备状态
  • 处理时间格式:原日志时间里毫秒用冒号分隔,需要替换成点才能被datetime正常解析
  • 维护上一次设备切换为ON的时间变量,每次检测到OFF状态时计算两者的时间差即为本次ON的持续时长
  • 支持批量统计所有ON周期的时长,也可处理日志结束时设备仍处于ON状态的边界场景

完整代码示例

import re
from datetime import datetime

def count_on_duration(log_path: str, log_year: int = 2023) -> list:
    # 匹配设备状态行的正则:分组1是到秒的时间,分组2是毫秒,分组3是状态
    pattern = re.compile(r'^(\w{3} \d{2} \d{2}:\d{2}:\d{2}):(\d{3}).*Device State: (ON|OFF)$')
    last_on_time = None
    on_durations = []
    
    with open(log_path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            match = pattern.match(line)
            if not match:
                continue
            
            # 解析时间
            time_part = match.group(1)
            ms_part = match.group(2)
            state = match.group(3)
            # 拼接成符合datetime解析的格式
            full_time_str = f"{log_year} {time_part}.{ms_part}"
            current_time = datetime.strptime(full_time_str, "%Y %b %d %H:%M:%S.%f")
            
            if state == 'ON':
                last_on_time = current_time
            elif state == 'OFF' and last_on_time is not None:
                duration = current_time - last_on_time
                on_durations.append({
                    "start_time": last_on_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
                    "end_time": current_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
                    "duration_seconds": round(duration.total_seconds(), 3)
                })
                last_on_time = None
    
    # 处理日志结束时设备仍处于ON的情况
    if last_on_time is not None:
        on_durations.append({
            "start_time": last_on_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
            "end_time": "日志结束仍处于ON状态",
            "duration_seconds": None
        })
    return on_durations

# 调用示例
if __name__ == "__main__":
    durations = count_on_duration("你的日志文件路径.log", log_year=2023)
    for item in durations:
        print(f"ON开始时间:{item['start_time']},结束时间:{item['end_time']},持续时长:{item['duration_seconds']}秒")

注意事项

  • 代码里的log_year需要根据你日志实际产生的年份修改,避免时间计算错误
  • 如果日志存在多个设备的状态记录,可以修改正则表达式增加设备ID的匹配分组,分别统计不同设备的ON时长
  • 若日志里的时间和当前时区不同,可以在解析后用pytz模块做时区转换后再计算差值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:18:02