首页 > 解决方案 > 如何在python中将纬度/经度值转换为十进制?

问题描述

我在这样的数据框中有LatitudeLongitude列:

   Station      Latitude     Longitude
0        1  18° 23' 20.9  72° 23' 25.9
1        2  17° 22' 20.5  73° 22' 21.5
       etc           etc           etc

值之间有空格。我想将经纬度值转换为十进制(浮点数)

我试过这段代码:

def dms2dd(s):   
    degrees, minutes, seconds = re.split('[°\'\ ]+', s)
    dd = -1*float(degrees) -1*float(minutes)/60 -1*float(seconds)/(60*60);
    return dd

df['LATITUDE'] = df['LATITUDE'].apply(dms2dd)
df['LONGITUDE'] = df['LONGITUDE'].apply(dms2dd)

但是给我一个错误:

ValueError:要解包的值太多(预期为 3)。

车站位于南半球(这就是我在函数中使用 (-) 的原因)。

你能帮我吗?

标签: pythonpandasfunctiondataframe

解决方案


Series.str.extract与给定的正则表达式一起使用从给定的地理坐标pattern中提取和分量degree,然后使用公式将值转换为十进制度(注意:如果坐标来自南半球或西半球,您可以相应地调整公式):minutessecondsDMS

pattern = r'(?P<d>[\d\.]+).*?(?P<m>[\d\.]+).*?(?P<s>[\d\.]+)'

dms = df['Latitude'].str.extract(pattern).astype(float)
df['LATITUDE'] = dms['d'] + dms['m'].div(60) + dms['s'].div(3600)

# Similarly we do for the longitude    
dms = df['Longitude'].str.extract(pattern).astype(float)
df['LONGITUDE'] = dms['d'] + dms['m'].div(60) + dms['s'].div(3600)

结果:

# print(df)

   Station      Latitude     Longitude   LATITUDE  LONGITUDE
0        1  18° 23' 20.9  72° 23' 25.9  18.389139  72.390528
1        2  17° 22' 20.5  73° 22' 21.5  17.372361  73.372639

推荐阅读