1

我正在尝试使用read_sql_query()从 MySQL 数据库读取查询,数据库中的字段之一,它的类型是double(24, 8),我想使用dtype=参数来完全控制数据类型并将其读取到decimal,但似乎熊猫不能识别decimal类型,所以我不得不阅读它Float64

在数据库中,该字段的值如下所示:

Value
100.96000000
77.17000000
1.00000000
0.12340000

然后我试图从 Python 代码中读取它:

from decimal import *

dtypes = {
        'id': 'Int64',
        'date': 'datetime64',
        'value': 'Float64'
    }

df = pd.read_sql_query(sql_query, mysql_engine, dtype=dtypes)

但是从上面的代码中读取数据后,它看起来像这样:

Value
100.96
77.17
1.0
0.1234

如何阅读此栏decimal并保留所有数字?谢谢。

4

1 回答 1

0

“数据在数据库中的样子”很棘手。这是因为将其打印出来的行为通过格式化算法提供了位。在这种情况下,它会删除尾随零。要查看“数据库中”的内容,需要获取文件的十六进制转储,然后对其进行解密;这是不平凡的

相信DECIMAL数字包含所有指定的数字,每个字节压缩 2 位数字。不,我不知道它们是如何包装的(0..99 与 2 个十六进制数字;如果数字为奇数怎么办;符号在哪里?)

相信并且FLOAT完全DOUBLE符合 IEEE-764 编码格式。不,我不知道字节是如何存储的(大端与小端)。我怀疑 PythonFloat64是 IEEE的DOUBLE

对于DECIMAL(10,6),我希望看到“1.234”存储为+0001234000,但从不显示前导零,并且可以选择显示尾随零 - 取决于输出格式化包。

因为DOUBLE,我希望3ff3be76c8b43958在调整字节序后找到十六进制,看到输出是 ,我不会感到惊讶1.23399999999999999e+0。(是的,考虑到我正在使用的 PHP 中的合适格式,我实际上得到了这一点。)我希望看到1.234,因为这可能是数字的意图。

不要使用DOUBLE(m,n). (m,n)导致额外的舍入,它是不推荐使用的语法。Float 和 Double 不适用于精确的小数位数;用于DECIMAL此类。

For FLOAT: 1.234 变为十六进制3f9df3b6并显示类似于1.2339999675751假设输出方法有效DOUBLE并被要求显示许多小数位的内容。

底线:使用的输出方法导致了问题。

于 2021-10-01T15:25:39.747 回答