Python使用pandas读取xlsx文件出现数值精度不准确问题如何解决
问题描述
在Python中加载xlsx格式文件时,会出现部分读取到的数值精度不准确的问题。已知使用Decimal类型可获得更高精度,但当前从数据集中获取的原始值本身就存在偏差。
相关参考截图:
- xlsx文件中问题数值所在的高亮行截图
- 从dataframe中提取该数值的输出结果截图
- 打印dataframe时展示的该数值的截图
当前加载数据的代码如下:
import pandas as pd data = pd.read_excel(r'A:\Deakin\Crypto\Export Trade History-2021-07-02 10_40_25.xlsx') df = pd.DataFrame(data)
对文件的加载方式、程序内的存储方式没有限制,也可接受比pandas更适合读取并存储为dataframe的方案。
解决方案
方案1:调整pandas读取逻辑,直接加载为Decimal类型
使用openpyxl作为读取引擎,通过转换器直接将数值列转为Decimal类型,避免默认float64类型的二进制存储带来的精度丢失:
import pandas as pd from decimal import Decimal from openpyxl import load_workbook # 指定特定列读取为Decimal df = pd.read_excel( r'A:\Deakin\Crypto\Export Trade History-2021-07-02 10_40_25.xlsx', converters={'需要高精度的列名': Decimal}, engine='openpyxl' ) # 若需要所有数值列都用Decimal存储,可直接读取单元格原始值 wb = load_workbook(r'A:\Deakin\Crypto\Export Trade History-2021-07-02 10_40_25.xlsx', data_only=True) ws = wb.active data = [] for row in ws.iter_rows(values_only=True): new_row = [] for cell in row: if isinstance(cell, (int, float)): new_row.append(Decimal(str(cell))) else: new_row.append(cell) data.append(new_row) df = pd.DataFrame(data[1:], columns=data[0])
方案2:使用高精度场景专用的读取库
针对加密货币交易这类对小数精度要求极高的场景,可以使用pyexcel库替代pandas默认读取逻辑,再转为DataFrame存储:
import pyexcel as pe import pandas as pd from decimal import Decimal records = pe.get_records(file_name=r'A:\Deakin\Crypto\Export Trade History-2021-07-02 10_40_25.xlsx') processed = [] for item in records: processed_item = {} for k, v in item.items(): if isinstance(v, (int, float)): processed_item[k] = Decimal(str(v)) else: processed_item[k] = v processed.append(processed_item) df = pd.DataFrame(processed)
方案3:调整浮点数展示精度(仅解决显示问题)
如果仅为打印时的展示偏差,实际存储精度满足需求,可以修改pandas的全局显示参数:
# 可根据需求调整小数显示位数 pd.set_option('display.float_format', '{:.10f}'.format)
注意事项
- 精度敏感场景不要使用默认float64类型存储数值,二进制浮点存储本身存在小数精度丢失的天然缺陷
- 转换Decimal时需直接读取xlsx原始数值,不要经过float中转,避免产生二次精度损失
内容的提问来源于stack exchange,提问作者David Cuthbertson
相关产品推荐
相关产品推荐

