2

列 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:)

4

2 に答える 2

7

そのコンバーターは少しハックです。このようなより堅牢なものをお勧めできますか?

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 文字列ではないもの (ヘッダー行など) を変換しようとしていることを示しています。

于 2012-09-21T01:12:35.790 に答える
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

危険なコンバーターの上に、コンバーターを間違った列に適用していると思います (取得した例外を見てください)。

于 2012-09-21T07:06:06.503 に答える