使用asammdf生成MDF文件时时间索引错误的技术求助
解决asammdf生成MDF文件时长错误问题
问题说明
使用Python的pandas DataFrame结合asammdf生成MDF文件,数据采样间隔为0.015秒,但生成的MDF文件显示总时长约11小时,而DataFrame实际时长仅约9分钟。推测asammdf默认将每个数据点视为1秒间隔,导致时间被放大了约66.6倍(1/0.015)。DataFrame包含datetime或Unix时间格式的时间列,但不清楚如何利用这些列让MDF文件显示正确时间,官方文档未找到对应方案。
解决方案
核心问题是mdf_obj.append(df)默认会把DataFrame的行索引当作秒级时间戳,而非使用自定义的TIME列。解决方法是手动将TIME列转换为asammdf要求的微秒级时间基准,作为信号的时间戳参数传入:
步骤说明
- 将datetime格式的TIME列转换为微秒级Unix时间戳(asammdf默认时间基准为微秒)
- 为每个数据信号创建
Signal对象,明确指定对应的时间戳 - 将Signal对象添加到MDF实例中
修改后的代码示例
import pandas as pd import numpy as np from asammdf import MDF, Signal data = { "TIME": pd.date_range(start='2024-01-01', periods=200, freq='15ms'), "FLOAT_SIGNAL": np.random.rand(200), } df = pd.DataFrame(data) # 将datetime转换为微秒级Unix时间戳 # pandas datetime64转int64为纳秒,除以1000转为微秒 timestamps = df["TIME"].astype(np.int64) // 1000 # 创建带时间戳的Signal对象 float_signal = Signal( samples=df["FLOAT_SIGNAL"].values, timestamps=timestamps, name="FLOAT_SIGNAL", unit="", # 可根据实际需求填写信号单位 comment="Generated from pandas DataFrame" ) # 初始化MDF并添加信号 mdf_obj = MDF() mdf_obj.append([float_signal]) mdf_obj.save(f"C:\\Users\\user\\Desktop\\output.mdf", compression=2)
补充说明
- 若TIME列是秒级Unix时间戳,需乘以
1e6转换为微秒级后再传入timestamps参数 - 手动指定时间戳后,MDF文件会基于真实时间间隔计算总时长,不再默认按1秒/数据点处理
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

