我正在尝试从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
答案 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核心。