Python读取日志文件、计算数据并绘制图表的实现方法咨询
Python读取日志文件、计算数据并绘制图表的实现方法咨询
看起来你已经迈出了第一步,但解析数据的方式还可以更精准,而且还需要补充计算和绘图的核心部分。我来帮你梳理完整的实现思路和可运行的代码:
一、核心问题分析
你的日志每行格式是[时间戳]+[偏移量]([序列号]),需要完成三个核心动作:
- 精准解析每行的三个关键数据:时间戳、偏移量、序列号
- 按需求完成计算(比如你示例里的「时间戳+偏移量」)
- 把计算结果和序列号关联,绘制成直观的图表
二、完整实现代码
下面是包含数据读取、解析、计算、绘图的完整脚本,我加了详细注释,方便你理解和修改:
import re import matplotlib.pyplot as plt # 配置日志文件路径 log_name = 'test_rtt_25-01-17_13-07-41_values5_rate50.log' log_path = "/home/ubuntu/results-25-01-09-docker/" true_path = log_path + log_name # 初始化列表存储解析和计算后的数据 sequence_numbers = [] original_timestamps = [] offsets = [] calculated_values = [] with open(true_path, "r") as f: lines = f.readlines() # 跳过第一行的注释行 for line in lines[1:]: line = line.strip() if not line: # 跳过空行 continue # 用正则表达式精准匹配日志格式,避免字符串拆分的边界问题 match_result = re.match(r'(\d+\.\d+)\+([\d.e-]+)\((\d+)\)', line) if match_result: # 提取并转换数据类型 timestamp = float(match_result.group(1)) offset = float(match_result.group(2)) seq_id = int(match_result.group(3)) # 按照你给出的示例完成计算:原始时间戳 + 偏移量 calculated = timestamp + offset # 存入对应列表 sequence_numbers.append(seq_id) original_timestamps.append(timestamp) offsets.append(offset) calculated_values.append(calculated) # 可选:打印前5条解析结果,验证数据是否正确 print("=== 解析结果验证 ===") for idx in range(min(5, len(sequence_numbers))): print(f"序列{sequence_numbers[idx]}: 原始时间={original_timestamps[idx]:.9f}, 偏移={offsets[idx]:.9f}, 计算后={calculated_values[idx]:.9f}") # ---------------------- 绘图部分 ---------------------- # 创建画布,设置大小 plt.figure(figsize=(12, 8)) # 子图1:计算后的值 VS 序列号 plt.subplot(2, 1, 1) plt.plot(sequence_numbers, calculated_values, marker='o', linestyle='-', color='#1f77b4', markersize=4) plt.title('计算后时间戳 与 序列号的关系', fontsize=12) plt.xlabel('序列号', fontsize=10) plt.ylabel('计算后时间戳', fontsize=10) plt.grid(True, alpha=0.3) # 子图2:偏移量 VS 序列号(观察偏移的波动情况) plt.subplot(2, 1, 2) plt.plot(sequence_numbers, offsets, marker='s', linestyle='--', color='#ff7f0e', markersize=4) plt.title('偏移量 与 序列号的关系', fontsize=12) plt.xlabel('序列号', fontsize=10) plt.ylabel('偏移量 (秒)', fontsize=10) plt.grid(True, alpha=0.3) # 调整子图间距,避免标题重叠 plt.tight_layout() # 显示图表 plt.show()
三、可选扩展:计算时间间隔
如果你还想观察相邻数据点的时间间隔(比如分析数据采集的频率稳定性),可以在解析后加入这段代码:
# 计算相邻计算后值的时间间隔 if len(calculated_values) >= 2: time_intervals = [calculated_values[i+1] - calculated_values[i] for i in range(len(calculated_values)-1)] # 绘制时间间隔图表 plt.figure(figsize=(10, 4)) plt.plot(sequence_numbers[1:], time_intervals, marker='^', linestyle='-', color='#2ca02c', markersize=4) plt.title('相邻计算值的时间间隔', fontsize=12) plt.xlabel('序列号', fontsize=10) plt.ylabel('时间间隔 (秒)', fontsize=10) plt.grid(True, alpha=0.3) plt.show()
关键细节说明
- 用正则表达式解析数据比单纯的
split()更可靠,因为它能精准匹配日志的固定格式,避免因字符串格式微小变化导致的解析错误 - 跳过了第一行注释和空行,确保只处理有效数据
- 绘图部分用了
matplotlib的子图功能,可以同时展示多组数据的关系,你可以根据自己的需求调整图表的样式、坐标轴标签等 - 所有数据都转换成了正确的数值类型(浮点型/整型),确保计算和绘图不会出错
备注:内容来源于stack exchange,提问作者HUH987




