如何使用asammdf Python库向MDF文件添加字符串信号
解决MDF文件添加字符串通道的问题
问题场景
使用pandas DataFrame创建MDF文件时,字符串类型的通道无法正常添加,执行代码后报错。
测试代码
创建包含字符串列的DataFrame:
data = { "GLOBAL_TIME": [1, 2, 3, 4, 5], "INT_SIGNAL": [10, 20, 30, 40, 50], "FLOAT_SIGNAL": [1.1, 2.2, 3.3, 4.4, 5.5], "STRING_SIGNAL": ["a", "a", "a", "a", "a"], } df_test2 = pd.DataFrame(data)
尝试添加所有列到MDF:
new_mdf_from_df = MDF() for column in df_test2.columns: sig = Signal( samples=df_test2[column].values, timestamps=df_test2.index.values, name=column ) try: new_mdf_from_df.append(sig) except Exception as e: print(f"Error occurred while appending signal for column '{column}': {e}")
报错信息
Error occurred while appending signal for column 'STRING_SIGNAL': Unknown type: dtype=object, shape=(5,)
解决方案
MDF格式要求字符串通道必须明确指定编码类型和固定长度,无法自动识别pandas的object类型列。需要手动将字符串转换为统一长度的字节数组,并指定对应的MDF数据类型。
修改后的代码
from asammdf import MDF, Signal import asammdf.blocks.datatypes as dt import pandas as pd data = { "GLOBAL_TIME": [1, 2, 3, 4, 5], "INT_SIGNAL": [10, 20, 30, 40, 50], "FLOAT_SIGNAL": [1.1, 2.2, 3.3, 4.4, 5.5], "STRING_SIGNAL": ["a", "a", "a", "a", "a"], } df_test2 = pd.DataFrame(data) new_mdf_from_df = MDF() for column in df_test2.columns: col_data = df_test2[column] if col_data.dtype == object: # 获取字符串列的最大长度,统一填充到该长度 max_str_len = max(len(s) for s in col_data) # 将字符串编码为ASCII字节,不足长度用空格填充 byte_samples = [s.ljust(max_str_len).encode('ascii') for s in col_data] # 指定数据类型为ASCII,长度为max_str_len sig = Signal( samples=byte_samples, timestamps=df_test2.index.values, name=column, data_type=dt.ASCII(max_str_len) ) else: # 非字符串列直接创建信号 sig = Signal( samples=col_data.values, timestamps=df_test2.index.values, name=column ) try: new_mdf_from_df.append(sig) print(f"成功添加信号: {column}") except Exception as e: print(f"添加信号 {column} 失败: {e}") # 保存MDF文件 new_mdf_from_df.save('test_with_strings.mf4', overwrite=True)
关键说明
- 统一字符串长度:MDF要求字符串通道的每个样本长度一致,因此需要用
ljust/rjust将所有字符串填充到相同长度。 - 指定数据类型:使用
dt.ASCII(max_str_len)或dt.UTF8(max_str_len)明确字符串的编码和长度,对应编码时用encode('ascii')或encode('utf-8')。 - 字节数组转换:将字符串转换为字节数组后,才能被MDF库正确识别和存储。
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

