You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动