You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)

关键说明

  1. 统一字符串长度:MDF要求字符串通道的每个样本长度一致,因此需要用ljust/rjust将所有字符串填充到相同长度。
  2. 指定数据类型:使用dt.ASCII(max_str_len)或dt.UTF8(max_str_len)明确字符串的编码和长度,对应编码时用encode('ascii')或encode('utf-8')。
  3. 字节数组转换:将字符串转换为字节数组后,才能被MDF库正确识别和存储。

内容的提问来源于stack exchange,提问作者jB777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:22:30