使用asammdf(Python)创建MDF文件时时间索引错误问题
解决asammdf生成MDF时时间轴被放大的问题
你的推测完全正确:asammdf在默认情况下,直接append整个DataFrame时会自动生成一个步长为1秒的时间轴,这就导致实际采样间隔15ms的数据被错误拉长了约66.6倍。要解决这个问题,你只需要告诉asammdf使用DataFrame中已有的精确时间戳即可,这里有两种简便的实现方法:
方法一:使用append的time_column参数(推荐)
这是最直接的方式,只需在调用append时指定DataFrame中的时间列,asammdf会自动解析该列的时间作为每个样本的时间戳:
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) mdf_obj = MDF() # 指定TIME列作为时间轴,asammdf会自动处理datetime格式 mdf_obj.append(df, time_column="TIME") mdf_obj.save(f"C:\\Users\\user\\Desktop\\output.mdf", compression=2)
这个方法支持datetime64格式或Unix时间戳(整数/浮点数)的列,无需额外转换,asammdf会自动完成时间格式的适配。
方法二:手动创建Signal对象并指定时间戳
如果你需要更精细地控制信号属性(比如单位、描述等),可以手动为每个数据列创建Signal对象,并显式传入时间戳数组:
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列转换为asammdf支持的秒级Unix时间戳 # datetime64转纳秒整数后除以1e9得到秒数 timestamps = df["TIME"].astype(np.int64) / 1e9 # 创建信号对象,指定样本数据、名称和时间戳 float_signal = Signal( samples=df["FLOAT_SIGNAL"].values, name="FLOAT_SIGNAL", unit="", # 可根据实际需求填写单位,比如"V"或"%" timestamps=timestamps ) mdf_obj = MDF() # 添加信号到MDF对象 mdf_obj.append([float_signal]) mdf_obj.save(f"C:\\Users\\user\\Desktop\\output.mdf", compression=2)
验证效果
使用上述任意一种方法后,生成的MDF文件时间轴会与你DataFrame中的TIME列完全一致:示例中的200个样本总时长应为2024-01-01 00:00:02.985 - 2024-01-01 00:00:00.000 = 2.985秒,而非默认的199秒。对于你实际的9分钟数据,MDF也会正确显示对应的时长。
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

