如何使用Python的asammdf库向MDF文件添加字符串信号——解决DataFrame字符串通道添加报错问题
解决MDF文件创建时添加字符串信号的"Unknown type"报错
我之前也碰到过一模一样的问题——你用的asammdf库的Signal类没法自动识别pandas里object类型的字符串数组,所以才会抛出Unknown type的错误。下面是具体的解决办法:
核心原因
当你传入df_test2['STRING_SIGNAL'].values时,得到的是一个dtype=object的数组,Signal类只能自动推断数值类型(int、float这类),对字符串类型必须手动指定数据类型参数。
解决方案1:手动指定字符串数据类型
修改你的循环逻辑,判断列是否为字符串类型,然后给Signal添加data_type参数:
import pandas as pd from asammdf import MDF, Signal 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_values = df_test2[column].values col_dtype = df_test2[column].dtype # 判断是否为字符串列 if col_dtype == object and all(isinstance(val, str) for val in col_values): # 指定字符串类型,utf_8适用于大多数场景 sig = Signal( samples=col_values, timestamps=df_test2.index.values, name=column, data_type='utf_8' ) else: # 数值类型自动推断即可 sig = Signal( samples=col_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}") # 最后保存MDF文件 new_mdf_from_df.save('output.mf4', overwrite=True)
解决方案2:处理变长字符串(可选)
如果你的字符串信号长度不一致,MDF文件通常要求固定长度的字符串。这时候可以先统一字符串长度,再指定带长度的类型:
# 针对STRING_SIGNAL列处理变长字符串 str_col = df_test2['STRING_SIGNAL'] max_str_length = str_col.str.len().max() # 用空格填充到最大长度(也可以用其他字符) fixed_length_strings = str_col.str.ljust(max_str_length).values # 创建带固定长度的字符串信号 str_sig = Signal( samples=fixed_length_strings, timestamps=df_test2.index.values, name='STRING_SIGNAL', data_type=f'utf_8[{max_str_length}]' ) new_mdf_from_df.append(str_sig)
这样处理后,MDF文件就能正确识别并存储字符串通道了。
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

