2015-05-03 76 views
0

我是一名初學Python用戶,並且遇到了麻煩,理解了一些事情。我想在.csv文件中將2整列(lat,long)從度分秒(dms)轉換爲十進制度(dd)(即46°57'01「N到46.950278)。目前爲止,我已將我的.csv中的標題重命名爲可在ArcGIS中讀取,然後我使用Excel將°,'和N「替換爲空格,然後放入他們在一個新的.csv文件與他們各自的ID號(Acc_num)...想使用Python,但無法弄清楚我的生活。然後我用逗號替換空格以便能夠轉換每個節的座標。我也做了一個def將dms轉換爲dd,將dm轉換爲dd並將d轉換爲dd ...這樣做是因爲我的一些座標只有度數,有些只有度數分鐘。這是我的.csv文件當前格式的概述:Python,將成千上萬條記錄的.csv批量轉換度分秒數轉換爲十進制度

Acc_num lat  long 
881138 80,24  87,38 
882273 68,40  141 
889843 56,55,28 91,49,02 
787004 48  91,58 

我不知道怎麼我的DEFS適用於.csv文件做最後轉化爲DD。我需要保持列表的順序相同,因爲我想將這些列重新插入原始的,更詳細的.csv。

這是我到目前爲止有:

import csv 
from itertools import izip 
filename = r'C:\workspace\code\hl.csv' 
filename_comma = r'C:\workspace\code\hundlich4.csv' 
def dms_dd(degrees, minutes, seconds): 
    decimal = 0.0 
    if (degrees >= 0): 
     decimal = degrees + float(minutes)/60 + float(seconds)/3600 
    else: 
     decimal = degrees - float(minutes)/60 - float(seconds)/3600 
    return decimal 
def dm_dd(degrees, minutes): 
    decimal = 0.0 
    if (degrees >= 0): 
     decimal = degrees + float(minutes)/60 
    else: 
     decimal = degrees - float(minutes)/60 
    return decimal 
def d_dd(degrees): 
    decimal = 0.0 
    if (degrees >= 0): 
     decimal = degrees 
    else: 
     decimal = degrees 
    return decimal 
accession = [] 
latitudes = [] 
longitudes = [] 
f = open(filename) 
for line in f: 
    cells = line.split(',') 
    accession.append((cells[0])) 
    latitudes.append((cells[1])) 
    latitudes = [w.replace(' ', ',') for w in latitudes] 
    longitudes.append((cells[2])) 
    longitudes = [w.replace(' ', ',') for w in longitudes] 
    longitudes = [w.replace('\n', '') for w in longitudes] 
#puts commas where spaces are for the coordinates 
f.close() 

with open('C:\workspace\code\hundlich4.csv', 'wb') as fn: 
    writer = csv.writer(fn) 
    writer.writerows(izip(accession, latitudes, longitudes)) 
#writes columns with commas to a new csv called hundlich4.csv 

而現在我已經在做這個,我知道這是錯的,但我不知道該怎麼辦的轉換讓我defs應用。

accession2 = [] 
latitudes2 = [] 
longitudes2 = [] 

ff = open(filename) 
for line in ff: 
    cells = line.split(',') 
    accession2.append((cells[0])) 
    latitudes2.append((cells[1])) 
     for val in latitudes2: 
      dms_dd(val) 
    longitudes2.append((cells[2])) 
#longitudes2 = [w.replace(dms_dd(val) for w in longitudes] 

ff.close() 

任何幫助非常感謝!謝謝!

+0

,值之間用空格分隔,但在你的代碼,它們之間用逗號separeted 。哪一個是正確的? – Daniel

回答

1

首先,編寫轉換輸入的一條線,然後通過輸入線迴路的功能:

import csv 
filename = r'C:\workspace\code\hl.csv' 
filename_decimal = r'C:\workspace\code\hundlich4.csv' 

def dms_dd(degrees, minutes=0, seconds=0): 
    if degrees >= 0: 
     decimal = degrees + minutes/60.0 + seconds/3600.0 
    else: 
     decimal = degrees - minutes/60.0 - seconds/3600.0 
    return decimal 

def convert_line(data): 
    return data[0], dms_dd(*map(float,data[1].split())), dms_dd(*map(float, data[2].split())) 

with open(filename) as inf: 
    reader = csv.reader(inf) 
    with open(filename_decimal) as outf: 
     writer = csv.writer(outf) 
     writer.write(next(reader)) # header 
     for line in reader: 
      writer.write(convert_line(line)) 
在您的文章
相關問題