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

