如何用Python创建或保存IEEE单/双精度格式的二进制数据文件?
问题分析与解决办法
首先明确核心问题:你用df.to_csv()保存的是文本格式的CSV文件,而非原文件的二进制格式,这才是内容不符的根本原因。另外,numpy的single类型本身就是IEEE 754单精度浮点(对应C语言的float),double是IEEE 754双精度浮点(对应C语言的double),和原文件的格式完全匹配,不存在格式转换的问题。
正确的二进制保存方法
方法1:直接用numpy写回二进制文件
既然读取后得到的是numpy结构化数组,直接用np.tofile()就能原样保存为和原文件格式一致的二进制文件,不需要经过pandas中转:
import numpy as np bufType = np.dtype( [ ('datetime', 'double'), # 原代码字段名是text,建议改为datetime更直观 ('humidity', 'single'), ('temperature', 'single'), ('extra_param', 'single') ] ) path = r'C:\Users\Егор\Desktop\ЛК-44\pool-исходник\ccc.dat' data = np.fromfile(path, dtype=bufType) # 直接写回二进制文件 data.tofile('my_file.dat')
方法2:通过pandas中转后写回二进制
如果必须用pandas处理数据后再保存,需要先将DataFrame转回numpy结构化数组,再写入二进制:
import numpy as np import pandas as pd bufType = np.dtype( [ ('datetime', 'double'), ('humidity', 'single'), ('temperature', 'single'), ('extra_param', 'single') ] ) path = r'C:\Users\Егор\Desktop\ЛК-44\pool-исходник\ccc.dat' data = np.fromfile(path, dtype=bufType) df = pd.DataFrame(data) # 此处可对df进行数据处理操作 # 将DataFrame转回numpy结构化数组并保存 df.to_records(index=False).tofile('my_file.dat')
补充说明
- 若要验证保存的文件是否和原文件一致,可使用文件对比工具(如WinMerge)检查字节层面的差异。
- 如果后续需要解析日期时间值(基准为1899年12月30日),可以用pandas的
to_datetime转换:
注意:若要原样保存二进制,不要修改该字段的数值,否则写回的字节会发生变化。df['datetime'] = pd.to_datetime(df['datetime'], unit='D', origin='1899-12-30')
内容的提问来源于stack exchange,提问作者От А До Я
相关产品推荐
相关产品推荐

