Python,在.csv中批量转换度数分钟秒到十进制度数,包含数千条记录

时间:2015-05-03 17:29:44

标签: python excel csv

我是初学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文件当前格式的概述:

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()

非常感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

如果您将 csv 文件加载到 Pandas DataFrame 中,您可以使用库 clean_lat_long() 中的函数 DataPrep。使用 pip install dataprep 安装 DataPrep。

from dataprep.clean import clean_lat_long
df = pd.DataFrame({"latitude": ["46°57'01''N", "1°23'39.29''S"],
     "longitude": ["101°26'46.29''E", "101°35'30.45''E"]})

df2 = clean_lat_long(df, lat_col="latitude", long_col="longitude", split=True)
# print(df2)
        latitude        longitude  latitude_clean  longitude_clean
0    46°57'01''N  101°26'46.29''E         46.9503         101.4462
1  1°23'39.29''S  101°35'30.45''E         -1.3942         101.5918