使用 pandas 读取 excel 时精度损失

Posted

技术标签:

【中文标题】使用 pandas 读取 excel 时精度损失【英文标题】:loss of precision when using pandas to read excel 【发布时间】:2016-09-26 07:21:30 【问题描述】:

我尝试使用 pandas 将 excel 表读入数据框,但对于浮点列,数据读取不正确。我使用函数 read_excel() 来完成任务

在 excel 中,该值为 225789.479905466,而在数据框中,该值为 225789.47990546614,这使我无法将数据从 excel 导入数据库。

有没有人面临与 pandas.read_exel() 相同的问题。我没有问题将 csv 读取到数据框。

杰里米

【问题讨论】:

floating-point-gui.de 在导出到 csv(使用 Excel)然后使用 read_csv 时是否有同样的问题? 其实我只是检查的更详细,如果我使用 read_csv,我也会遇到同样的问题,我的一些单元格的精度高达 8 或 9 个数字 如果您导出为 CSV,然后在 CSV 文件中查看其中的数字如何?可能只是当您查看 Excel 时,它没有在屏幕上显示完整的精度。 正如我上面所说,使用 read_csv 加载会给我同样的问题,因为有很多浮点数 【参考方案1】:

我相信这只是浮点错误和/或默认 Excel 视图未向您显示数字的完整精度。

还要考虑以下几点:

from decimal import Decimal
x = Decimal(225789.479905466)
y = Decimal(225789.47990546614)  
print(abs(x - y)/y)
6.444904002816901933512563658E-16

那么 6.5e-14% 的差异会显着改变您的分析结果吗?

我敢打赌它不会。

【讨论】:

该文件存储了金额,因此我需要它是准确的 @JeremyNguyen 那么计算机上的浮点精度是错误的方法【参考方案2】:

Excel 可能会截断您的值,而不是 pandas。如果您从 Excel 导出到 .csv 并注意操作方式,那么您应该能够使用 pandas.read_csv 读取并维护所有数据。 pandas.read_csv 也有一个未记录的 float_precision kwarg,它可能有用,也可能没用。

【讨论】:

【参考方案3】:

您可以应用函数 lambda x : float( ':n'.format( x ) ) 来消除浮点错误,或者至少更正浮点的显示方式。

有关详细信息,请参阅link1 和 link2。

def fix_float_error(x): return float(':n'.format(x))

【讨论】:

以上是关于使用 pandas 读取 excel 时精度损失的主要内容,如果未能解决你的问题,请参考以下文章

java读取文件时 int强制转换为 byte,是如何保证结果正确的??不是损失了精度吗??

这种精度损失发生在哪里以及如何防止它?

在 Pandas 中使用多索引标题读取 excel 时选择列

Python:当文件在列标题中有特殊字符时,使用 Pandas 读取 Excel 文件

python的pandas读取excel时显示gbk怎么办

pandas读取csv文件时避免科学计数法(xxxe+09)