在Python中如何将DD(十进制度数)转换为DMS(度分秒)?

24

如何在Python中将十进制度数转换为度分秒?是否已经有现成的公式可用?


@David:这只是将小数部分乘以60的问题。您还需要什么? - SilentGhost
15个回答

0
# Program to convert degree to Degree, Minutes and Seconds
# Using try and except for int data validations
try:

    # Requesting input degree from user
    print ("degree to Degree Minutes seconds converter ". upper ())
    degree = float(input ("\nEnter Degree: "))
    
    # Casting input from float to int 
    degree_d = int(degree)
    
    # Working on minutes
    minute =60 * (degree - degree_d)
    minutes = int(minute)
    
    # Working on seconds
    second = 60 * (minute - minutes)
    # Rounding seconds to whole number 
    seconds= round(second)
    
    # print 
    print (f"\nThe Answer In Degree-Minutes-Seconds are: \n{degree_d}°{minutes}'{seconds}\"  ✓\n ") 


#Except

except ValueError:
    print ("Wrong Input ")

0
如果你的数据在DataFrame中,你可以使用库DataPrep中的函数clean_lat_long()。使用pip install dataprep安装DataPrep。
from dataprep.clean import clean_lat_long
df = pd.DataFrame({"coord": [(45.5003, -122.4420), (5.8833, -162.0833)]})

df2 = clean_lat_long(df, "coord", output_format="dms")
# print(df2)
                 coord                        coord_clean
0  (45.5003, -122.442)  45° 301.08″ N, 122° 2631.2″ W
1  (5.8833, -162.0833)  5° 5259.88″ N, 162° 459.88″ W

或者如果纬度和经度在不同的列中:

df = pd.DataFrame({"latitude": [45.5003, 5.8833], "longitude": [-122.4420, -162.0833]})

df2 = clean_lat_long(df, lat_col="latitude", long_col="longitude", output_format="dms")
# print(df2)
   latitude  longitude                 latitude_longitude
0   45.5003  -122.4420  45° 301.08″ N, 122° 2631.2″ W
1    5.8833  -162.0833  5° 5259.88″ N, 162° 459.88″ W

0
我的方法:
import sys
import math

dd = float(sys.argv[1])
f,d = math.modf(dd)
f,m = math.modf(60*f)
s = round(60*f, 6)

print(int(d), int(m), s)

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community
1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,比如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined
使用math.degrees(1.777036)进行测试,并将舍入设置为秒的小数点后1位,得到(101 48 60.0) —— 任何简单的转换都会遇到这类问题。 - DarkStar

0
这是PaulMcG答案的numpy版本,增加了将四舍五入到十分之一秒(您可以更改round函数的第二个参数)并将符号(-1或1)作为单独的值返回(这使我更容易处理纬度/经度值)。这里的主要区别是您可以传入一个decimal_degrees数组或一个单个double值(请注意,如果您传递一个列表,您将得到一个列表的列表)。在使用之前,请确保您对四舍五入行为感到满意,或者您可以将其删除。
def to_dms(decimal_degrees):
    # convert degrees into dms and a sign indicator
    degrees = np.array(decimal_degrees)
    sign = np.where(degrees < 0, -1, 1)
    r, s = np.divmod(np.round(np.abs(degrees) * 3600, 1), 60)
    d, m = np.divmod(r, 60)
    # np.transpose([d, m, s]*sign)  # if you wanted signed results
    return np.transpose([d, m, s, sign])

# print("array test:", to_dms([101.816652, -101.816653]))
# array test: [[101. 48. 59.9000000000232831 1.] [101. 49. 0. -1.]]

-1
def dms_to_deg(dms):
    import math
    import numpy as np
    a=math.fabs(dms)
    d=a//10000
    m=(a-d*10000)//100
    s=(a-d*10000-m*100)
    deg=(d+m/60+s/3600)*np.sign(dms)
    return deg

#---Usage
r1=dms_to_deg(243055.25)
r2=dms_to_deg(-243055.25)
print(r1,r2)

一个Python函数,用于将度分秒转换为十进制度数,适用于正负数。请查看使用示例。 - S.M.Saifullah
根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接