【问题标题】:teradata python module, float as NaNteradata python模块,浮动为NaN
【发布时间】:2017-10-27 02:07:47
【问题描述】:

我正在尝试从 teradata db 获取数据并获得浮点数的 NaN 值,但如果我在 SQL 脚本中使用 cast(val as float) 则可以。我该如何解决?

代码:

import teradata
    udaExec = teradata.UdaExec(appName = 'sel', version = '1.0', logConsole=False)

    session = udaExec.connect(method='odbc', 
                              system = 'db, 
                              username = 'usr, 
                              password='psw', 
                              driver= 'Teradata',
                              charset='UTF8'
                             )

    pd.read_sql('select 100000.0 as float_, 100000 as number_, cast(100000.0 as float) as float_cast', session)

输出:

float_  number_ float_cast
NaN 100000.0    100000.0

【问题讨论】:

  • 1. 浮点数是邪恶的。 2. 这可能是我的 Java 程序员,但我讨厌隐式转换和弱类型。 3. 投射有什么问题?
  • 铸造是可以的,如果你有很少的列,但如果你需要超过 10 个浮动列,这可能很烦人。

标签: python-3.x odbc teradata


【解决方案1】:

我在同一个问题上苦苦挣扎了几个小时。事实证明,无需更改 teradata 模块即可轻松解决此问题。

只需添加 USEREGIONALSETTINGS 参数:

session = udaExec.connect(
        method= 'odbc'
        , driver = 'Teradata'
        , charset = 'UTF8'
        , dsn=dsn
        , USEREGIONALSETTINGS='N'
        , username=username
        , password=password
        )

之后你应该得到你想要的:

    float_      number_     float_cast
0   100000.0    100000.0    100000.0

【讨论】:

    【解决方案2】:

    问题在于 Teradata 将 100000.0 作为 100000,0 返回,因此无法将其转换为数字。 因此您可以编辑 datatypes.py 文件并在点上添加替换逗号:

        if value is not None:
                #added row below
                value = str(value).replace(",", ".")
                if typeCode == NUMBER:
                    try:                  
                        return NUMBER(value)
                    except:
                        # Handle infinity and NaN for older ODBC drivers.
                        if value == "1.#INF":
                            return NUMBER('Infinity')
                        elif value == "-1.#INF":
                            return NUMBER('-Infinity')
                        else:
                            return NUMBER('NaN')
    

    这可能有点野蛮,但确实有效。

    附:编辑完datatypes.py文件后别忘了重启python核心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 2018-11-11
      • 2016-10-18
      • 2019-09-14
      • 2012-03-09
      • 2018-03-04
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多