如何在Python中将十进制度转换为度数分钟秒?是否已经编写了一个公式?
答案 0 :(得分:13)
这正是divmod
的发明:
>>> def decdeg2dms(dd):
... mnt,sec = divmod(dd*3600,60)
... deg,mnt = divmod(mnt,60)
... return deg,mnt,sec
>>> dd = 45 + 30.0/60 + 1.0/3600
>>> print dd
45.5002777778
>>> decdeg2dms(dd)
(45.0, 30.0, 1.0)
答案 1 :(得分:9)
这是我基于Paul McGuire的更新版本。这个应该正确处理否定。
def decdeg2dms(dd):
is_positive = dd >= 0
dd = abs(dd)
minutes,seconds = divmod(dd*3600,60)
degrees,minutes = divmod(minutes,60)
degrees = degrees if is_positive else -degrees
return (degrees,minutes,seconds)
答案 2 :(得分:8)
如果要正确处理负数,则将第一个非零指标设置为负数。与通常的做法相反,将所有度数,分钟和秒指定为负数(Wikipedia显示40°26.7717,-79°56.93172作为度 - 分表示法的有效示例,其中度为负数且分钟数为如果度数部分为0,则将度数设置为负数没有任何影响。这是一个根据Paul McGuire和baens的函数充分处理这个问题的函数:
def decdeg2dms(dd):
negative = dd < 0
dd = abs(dd)
minutes,seconds = divmod(dd*3600,60)
degrees,minutes = divmod(minutes,60)
if negative:
if degrees > 0:
degrees = -degrees
elif minutes > 0:
minutes = -minutes
else:
seconds = -seconds
return (degrees,minutes,seconds)
答案 3 :(得分:6)
只有几个* 60
次乘法和几个int
截断,即:
>>> decdegrees = 31.125
>>> degrees = int(decdegrees)
>>> temp = 60 * (decdegrees - degrees)
>>> minutes = int(temp)
>>> seconds = 60 * (temp - minutes)
>>> print degrees, minutes, seconds
31 7 30.0
>>>
答案 4 :(得分:3)
这是我的Python代码:
def DecimaltoDMS(Decimal):
d = int(Decimal)
m = int((Decimal - d) * 60)
s = (Decimal - d - m/60) * 3600.00
z= round(s, 2)
if d >= 0:
print ("N ", abs(d), "º ", abs(m), "' ", abs(z), '" ')
else:
print ("S ", abs(d), "º ", abs(m), "' ", abs(z), '" ')
答案 5 :(得分:2)
最好单独返回该符号,以便可以使用它来选择('N', 'S')
或('E', 'W')
。
import math
def dd_to_dms(degs):
neg = degs < 0
degs = (-1) ** neg * degs
degs, d_int = math.modf(degs)
mins, m_int = math.modf(60 * degs)
secs = 60 * mins
return neg, d_int, m_int, secs
答案 6 :(得分:2)
改善@chqrlie答案:
def deg_to_dms(deg, type='lat'):
decimals, number = math.modf(deg)
d = int(number)
m = int(decimals * 60)
s = (deg - d - m / 60) * 3600.00
compass = {
'lat': ('N','S'),
'lon': ('E','W')
}
compass_str = compass[type][0 if d >= 0 else 1]
return '{}º{}\'{:.2f}"{}'.format(abs(d), abs(m), abs(s), compass_str)
答案 7 :(得分:1)
这是我略有不同的方法,对于正和负十进制度,其工作方式与我的HP Prime相同...
def dms(deg):
f,d = math.modf(deg)
s,m = math.modf(abs(f) * 60)
return (d,m,s * 60)
答案 8 :(得分:0)
使用fmod
并进行四舍五入以获得度数和分数。将分数乘以60并重复以获得分钟和余数。然后再将该最后一部分乘以60得到秒数。
答案 9 :(得分:0)
现在我们可以使用LatLon库...
https://pypi.org/project/LatLon/
>> palmyra = LatLon(Latitude(5.8833), Longitude(-162.0833)) # Location of Palmyra Atoll in decimal degrees
>> palmyra = LatLon(5.8833, -162.0833) # Same thing but simpler!
>> palmyra = LatLon(Latitude(degree = 5, minute = 52, second = 59.88),
Longitude(degree = -162, minute = -4.998) # or more complicated!
>> print palmyra.to_string('d% %m% %S% %H') # Print coordinates to degree minute second
('5 52 59.88 N', '162 4 59.88 W')`
答案 10 :(得分:0)
如果您的数据位于 DataFrame 中,您可以使用库 clean_lat_long()
中的函数 DataPrep。使用 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° 30′ 1.08″ N, 122° 26′ 31.2″ W
1 (5.8833, -162.0833) 5° 52′ 59.88″ N, 162° 4′ 59.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° 30′ 1.08″ N, 122° 26′ 31.2″ W
1 5.8833 -162.0833 5° 52′ 59.88″ N, 162° 4′ 59.88″ W