我是初学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()
非常感谢任何帮助!谢谢!
答案 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