2017-05-26 35 views
0

我試圖從teradata db中獲取數據,並且我爲浮動塊獲取了NaN值,但是如果我在SQL腳本中使用cast(val作爲float),那麼它工作正常。我該如何解決它?teradata python模塊,浮動爲NaN

代碼:

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浮筒是邪惡的。 ** 2這可能是我的Java程序員,但我討厭隱式強制轉換和弱打字。 ** 3。**鑄造它有什麼問題? – Andrew

+0

如果你的柱子很少,鑄造就可以了,但是如果你需要多於10個浮動柱子的話,那就很麻煩了。 –

回答

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核心。

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