Python 如何将度-分-秒转换为度-小数

Python 如何将度-分-秒转换为度-小数,python,parsing,gis,Python,Parsing,Gis,我通过以下格式从GPS接收纬度和经度: 纬度:北纬78°55'44.29458 我需要将此数据转换为: 纬度:78.928888889 我在这里找到了这个代码: 它正在为这种格式工作 dd = parse_dms("78°55'44.33324'N" ) 但是它对我的datafromat不起作用。有人能帮我解决这个问题吗?问题是秒44.29458在被分割 您可以直接定义拆分字符(而不是不拆分的位置): 或者保持正则表达式不变,合并第2部分和第3部分: dms2dd(part

我通过以下格式从GPS接收纬度和经度:

纬度:北纬78°55'44.29458

我需要将此数据转换为:

纬度:78.928888889

我在这里找到了这个代码:

它正在为这种格式工作

dd = parse_dms("78°55'44.33324'N" )

但是它对我的datafromat不起作用。有人能帮我解决这个问题吗?

问题是秒44.29458在
被分割

您可以直接定义拆分字符(而不是不拆分的位置):

或者保持正则表达式不变,合并第2部分和第3部分:

dms2dd(parts[0], parts[1], parts[2] + "." + parts[3], parts[4])

更新:

您的方法调用
dd=parse_dms(“78°55'44.33324”N)
是一个语法错误。请添加结束符
,然后转义另一个。或对字符串定义使用三重引号:

parse_dms("""78°55'44.29458"N""")

我稍微修改了re:

parts = re.split('[^\d\w\.]+', dms)
正如@Falko建议的那样,您可以使用双引号或转义引号字符

parse_dms("53°19\'51.8\"N")
上述功能(dms2dd)不正确

实际(有误):

如果方向='E'或方向='N': dd*=-1

纠正条件:

如果方向=='W'或方向=='S': dd*=-1

这是我的一行代码(很好,很好-可能是两行):)


这将输出
51.60255

对于多个坐标,您可以使用pandas读取它们。格式化很重要-不应该有任何空格。可以使用“替换”功能删除空白。输出可以很容易地保存为文本文件或电子表格。我只是打印出来进行验证,并将小数点位置四舍五入到4

### read input file
df = pd.read_excel('dms.xlsx')

n = len(df)

for i in range(n):
  Lat_d = round(parse_dms(df.Lat[i].replace(" ", "")),4)
  Long_d = round(parse_dms(df.Long[i].replace(" ", "")),4)
  print(Lat_d, Long_d)

我知道这是一个古老的问题,但是对于任何一个关注这个问题的人来说,我想指出的是,
dms2d()
函数中关于小数符号的逻辑似乎不正确。你有:

if direction == 'E' or direction == 'N':
    dd *= -1
但只有当方向是本初子午线的西(W)或赤道的南(S)时,它才应该是负的。所以应该是:

if direction == 'W' or direction == 'S':
    dd *= -1
这里引用了一篇详尽的指南:

纬度线的坐标表示纬度线的北面 因为它是正的。如果数字为负数,则为 表示赤道以南

[…]经线的坐标表示经线的东面 本初子午线,因为它是正的。如果数字为负数,则为 代表本初子午线以西

如果数据位于数据帧中,则可以使用库中的函数。使用
pip安装DataPrep
安装DataPrep

从dataprep.clean导入clean\u lat\u long
df=pd.数据帧({“纬度”:[“78°55'44.29458''N”,“51°36'9.18''N]”)
df2=干净的纬度(df,lat\u col=“纬度”)
纬度
0 78°55'44.29458''北纬78.9290
1 51°36'9.18''北纬51.6026度
您可以使用此模块

将DMS转换为十进制。 用法
当我将第二个选项添加到codeUm时,它仍然不起作用,如果调用函数,如
parse_dms(“78°55'44.33324”N)
,这是一个语法错误。您需要像我一样传递字符串:
parse_dms(““78°55'44.29458”N”“”)
。或者您可以像
“78°55'44.29458\”N“
“78°55\”44.29458”这样转义引号“N”
。有关更多详细信息,您应该了解Python中定义字符串的语法。啊,好的,现在我知道了。谢谢Falko:)如果我有一个包含大量此类坐标的数组,那么如何通过此函数进行转换?
### read input file
df = pd.read_excel('dms.xlsx')

n = len(df)

for i in range(n):
  Lat_d = round(parse_dms(df.Lat[i].replace(" ", "")),4)
  Long_d = round(parse_dms(df.Long[i].replace(" ", "")),4)
  print(Lat_d, Long_d)
if direction == 'E' or direction == 'N':
    dd *= -1
if direction == 'W' or direction == 'S':
    dd *= -1
from dms2dec.dms_convert import dms2dec

dms2dec('''36°44'47.69"N''') # converts to dec
dms2dec('''3° 2'33.53"E''') # converts to dec