2012-09-21 36 views
1

我有,其中,列6和7是GPS位置的形式爲.txt數據:轉換器,用於蟒熊貓

50;18.5701400N,4;07.7693770E 

當我通過read_csv讀它,我嘗試通過使用轉換器將其轉換爲笛卡爾座標。我寫的功能轉換

convertFunc = lambda x : float((x[0:5]+x[6:12]).replace(';','.')) 
convert = {6:convertFunc,7:convertFunc} 

當我使用它在單值它的工作原理我怎麼想:

convertFunc(myData.Lat[1]) 
Out [159]: 55.187110250000003 

當我嘗試在read_csv使用它,它不工作

myData = DataFrame(read_csv('~/data.txt', sep=',' names=['A', 'B', 'C', 'D', 'E', 'Lat', 'Long'],converters=convert)) 

我有一個錯誤:

... 
convertFunc = lambda x : float((x[0:5] + x[6:12]).replace(';', '.')) 
ValueError: invalid literal for float(): DGPS ongitu 

我不知道它在哪裏出錯或者我在轉換器中誤解了什麼? 或者,也許任何人都知道以這種形式使用GPS數據的好方法(包)?

(我認爲這可能是有些問題lambda當我想要我的功能應用到專欄中,我有一個錯誤:TypeError: only length-1 arrays can be converted to Python scalars

+1

它看起來像你試圖轉換*標題行* ...嘗試離開'names =',以便'read_csv'從標題行獲取列名稱。 – nneonneo

+0

感謝您的回覆。我刪除了'names =',但它不會改變,具有相同的錯誤。 – tomasz74

+0

嗯,試試'skiprows = 1'?也許發佈你的'data.txt'的樣本,以清楚問題是什麼。 – nneonneo

回答

5

即轉換器是一個有點哈克;我可以推薦一些更健壯的東西嗎?

def convert_dmds(s): 
    deg, min = s[:-1].split(';') 
    sign = 1 if s[-1] in 'NE' else -1 
    return sign * (float(deg) + float(min)/60.0) 

def convert_gps(s): 
    lat, lon = s.split(',') 
    return (convert_dmds(lat), convert_dmds(lon)) 

此外,該錯誤表明您正在嘗試轉換明顯不是GPS字符串的東西 - 標題行,也許?

0

您的轉換器不正常。

In [67]: convertFunc = lambda x : float((x[0:5]+x[6:12]).replace(';','.')) 

In [68]: convertFunc('4;07.7693770E') 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
... 
ValueError: invalid literal for float(): 4.07.693770 

在一個狡猾的轉換器之上,我想你應用轉換器到錯誤的列(看看你得到的異常)。