Convert DD (decimal degrees) to DMS (degrees minutes seconds) in Python? Convert DD (decimal degrees) to DMS (degrees minutes seconds) in Python? python python

Convert DD (decimal degrees) to DMS (degrees minutes seconds) in Python?


This is exactly what divmod was invented for:

>>> 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 dd45.5002777778>>> decdeg2dms(dd)(45.0, 30.0, 1.0)


Here is my updated version based upon Paul McGuire's. This one should handle negatives correctly.

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)


If you want to handle negatives properly, the first non-zero measure is set negative. It is counter to common practice to specify all of degrees, minutes and seconds as negative (Wikipedia shows 40° 26.7717, -79° 56.93172 as a valid example of degrees-minutes notation, in which degrees are negative and minutes have no sign), and setting degrees as negative does not have any effect if the degrees portion is 0. Here is a function that adequately handles this, based on Paul McGuire's and baens' functions:

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)