2

one.csv:

12.23496740, -11.95760385, 3, 5, 11.1, 4
12.58295928, -11.39857395, 4, 7, 12.3, 6
12.42572572, -11.09478502, 2, 5, 12.3, 8
12.58300286, -11.95762569, 5, 11, 3.4, 7

2.csv:

12.5830, -11.3986, .2, 4
12.4257, -11.0948, .7, 3

0 列目と 1 列目で 2 つの csv ファイルを一致させ、最終的に次のように one.csv の列 4 と two.csv の列 2 から対応する値を含む csv ファイルを出力したいと思います。

three.csv

12.5830, -11.3986, 12.3, .2
12.4257, -11.0948, 12.3, .7
4

4 に答える 4

0

csv1とcsv2があるように、両方のcsvファイルをリストのリストに読み込みます。次に、それらすべてをループするには、次のようにします。

for e1 in csv1:
    for e2 in csv2:
         distance = d(e1[0],e1[1], e2[0], e2[1]) #using a function call to your distance formula

結果を保存するには、後で簡単に出力できるように辞書を使用できます。したがって、新しいエントリを保存する場合:

output_dict[(e1[0], e1[1])] = [e1[3], e2[3]]
于 2013-06-25T17:14:34.367 に答える
0

上記の問題がどこにあるのか正確にはわかりません。座標のセットに基づいて距離を計算するためにアルゴリズムを使用する場合は、以下のコードを自由に使用してください。

from math import radians, cos, sin, asin, sqrt

def haversine(lat1, lng1, lat2, lng2, metric=False):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    earths_radius_km = 6378.1
    # convert decimal degrees to radians 
    lat1, lng1, lat2, lng2 = map(radians, [lat1, lng1, lat2, lng2])
    # haversine formula 
    dlat = lat2 - lat1
    dlng = lng2 - lng1
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlng/2)**2
    c = 2 * asin(sqrt(a)) 
    km = earths_radius_km * c
    if not metric:
        km_to_miles = 0.621371192
        dist = km * km_to_miles
        units = 'miles'
    else:
        dist = km
        units = 'km'
    return dist, units

if __name__ == '__main__':
    print 'Please call from within another script'
    # example...
    lat1, lng1, lat2, lng2 = 51.0820266, 1.1834209, 52.4931226, -2.1786751
    print 'e.g. distance in km is:', haversine(lat1, lng1, lat2, lng2, True)
    print 'e.g. distance in miles is:', haversine(lat1, lng1, lat2, lng2)

私の理解が正しければ、あるファイルの座標をループして、別のファイルで最も近い座標を見つけたいですか? この場合、min_distance を任意の高い値 (最初のセットの各値に対して 1000000 など) に初期化し、2 番目の座標セットをループして上記の式 (または使用する任意の距離関数) を呼び出し、min_distance を次の値にリセットします。結果が < 現在の min_distance の場合の結果 (および、2 番目のリストから必要な追加の値を一時変数に格納し、より短い距離を見つけるたびに上書きします)。内側のループですべての反復を実行したら、外側のループの次の反復を開始する前に、必要なデータをリストに格納できます。

于 2013-06-25T17:15:50.277 に答える
0

良い答えだとは思いませんが、問題の解決策は次のとおりです。

import sys
import math

def dist(point1, point2):
  return math.sqrt((point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)

one = []
two = []

with open('one.csv', 'r') as f:
    for line in f.readlines():
        x, y, _, _, _4, _ = line.split(',')
        one.append((float(x), float(y), float(_4)))

with open('two.csv', 'r') as f:
    for line in f.readlines():
        x, y, _2, _ = line.split(',')
        two.append((float(x), float(y), float(_2)))

with open('three.csv', 'w') as f:
    for point in two:
        nearest = None
        distance = sys.float_info.max
        for point2 in one:
            d = dist(point2, point)
            if d < distance:
                distance = d
                nearest = point2
        f.write("%f, %f, %f, %f\n" % (point[0], point[1], nearest[2], point[2]))

three.csv への出力を生成します。

12.583000, -11.398600, 12.300000, 0.200000
12.425700, -11.094800, 12.300000, 0.700000

書式設定が必要な場合は、スニペットの最後の行で行ってください。

于 2013-06-25T17:21:13.667 に答える