2012-09-21 37 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 

在一个狡猾的转换器之上,我想你应用转换器到错误的列(看看你得到的异常)。