我有一个.txt数据,其中第6列和第7列是以下形式的GPS位置:

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

最佳答案

那个转换器有点黑。我可以推荐一些更坚固的东西吗?

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字符串-可能是标题行?

10-07 19:11
查看更多