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)