本文介绍如何使用 numpy 成功加载以逗号作为小数点分隔符(如 `1,00000e+00`)的 dsc 实验数据,解决 `valueerror: could not convert string to float` 问题,并提取温度与热流信号用于后续可视化。
DSC(差示扫描量热法)原始数据常以本地化格式导出,尤其在欧洲地区,系统默认使用逗号(,)代替英文句点(.)作为小数点。这会导致 np.loadtxt() 默认解析失败——因为它严格按 C 语言浮点格式识别 .,而将 , 视为非法字符。
直接使用 converters 参数是简洁可靠的解决方案。注意:np.loadtxt 的 converters 接收一个字典(键为列索引,值为转换函数),而非单个 lambda 函数。上文答案中的写法存在语法错误,需修正如下:
import numpy as np
filename = 'HA_A001_PBS.txt'
# 正确用法:为每一列(或关键列)指定转换器
converters = {
1: lambda s: float(s.replace(b',', b'.')), # t 列(第1列,索引从0起)
2: lambda s: float(s.replace(b',', b'.')), # Heatflow 列
3: lambda s: float(s.replace(b',', b'.')) # Tr 列
}
data = np.loadtxt(filename, skiprows=2, encoding='utf-8', converters=converters)
Temp = data[:, 3] # 温度 [°C]
HeatFlow = data[:, 2] # 热流 [mW]⚠️ 关键注意事项:
进阶推荐:对于复杂或不规则的 DSC 文本,建议改用 pandas.read_csv(),它对本地化数字格式支持更完善:
import pandas as pd
df = pd.read_csv(
filename,
skiprows=2,
sep=r'\s+',
engine='python',
decimal=',', # 明确声明逗号为小数点
comment='#'
)
Temp = df['Tr'].values
HeatFlow = df['Heatflow'].values至此,数据已成功转为浮点数组,可立即用于 Matplotlib 绘图:
import matplotlib.pyplot as plt
plt.plot(Temp, HeatFlow, 'b-', linewidth=1.2)
plt.xlabel('Temperature [°C]')
plt.ylabel('Heat Flow [mW]')
plt.title('DSC Curve: HA_A001_PBS')
plt.grid(True, alpha=0.3)
plt.show()总结:处理含逗号小数
