【问题标题】:pandas `read_sql_query` - read `double` datatype in MySQL database to `Decimal`pandas `read_sql_query` - 将 MySQL 数据库中的`double` 数据类型读取为`Decimal`
【发布时间】:2021-11-22 06:04:13
【问题描述】:

我正在尝试使用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 并保留所有数字?谢谢。

【问题讨论】:

  • 一个数字可以用多种方式表示。向我们展示生成0.12340000 的代码、读取该代码的代码以及显示0.1234 的代码。
  • 嗨,我没有生成0.12340000 的代码(这就是我要问的一点),这就是数据库中数据的样子。代码正在生成0.1234 是我问题顶部的代码。
  • 请向我们展示读取数据并显示的代码 100.96.

标签: python mysql pandas decimal read-sql


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 您好,谢谢,我对数据库端没有控制权,所以我无法更改数据在数据库中的存储方式,该字段是Decimal 在数据库中键入,我的最初的问题是如果有意义的话,我如何在使用read_sql_query() 读取数据后指定类型以将其保持为Decimal
  • @Cecilia - DECIMAL(m,n) 保留尾随零。 display 机制正在移除它们!
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多