teradata python module, float as NaN



我正在尝试从 teradata db 获取数据,并获得了浮点数的 NaN 值,但是如果我在 SQL 脚本中使用 cast(val 作为浮点数(,它工作正常。我该如何解决它?

法典:

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

我在同样的问题上挣扎了几个小时。事实证明,在不更改 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

问题是 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')

可能这有点野蛮,但它有效。

附言:编辑文件后不要忘记重新启动python datatypes.py 核心。

最新更新