teradata python模块,浮动为NaN

时间:2017-05-26 08:39:30

标签: python-3.x odbc teradata

我正在尝试从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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')

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

P.S。编辑datatypes.py文件后,不要忘记重新启动python核心。