function to convert degree (hour), minute, seconds string to integer

John Machin sjmachin at lexicon.net
Wed Jul 26 23:18:01 EDT 2006


google0 at lazytwinacres.net wrote:
> I know this is a trivial function, and I've now spent more time
> searching for a surely-already-reinvented wheel than it would take to
> reinvent it again, but just in case... is there a published,
> open-source, function out there that takes a string in the form of
> "hh:mm:ss" (where hh is 00-23, mm is 00-59, and ss is 00-59) and
> converts it to an integer (ss + 60 * (mm + 60 * hh))?  I'd like
> something that throws an exception if hh, mm, or ss is out of range, or
> perhaps does something "reasonable" (like convert "01:99" to 159).
> Thanks,
>     --dang
> p.s.
> In case this looks like I'm asking for a homework exercise, here's what
> I'm using now.  It returns False or raises a ValueError exception for
> invalid inputs.  I'm just wondering if there's an already-published
> version.
> def dms2int(dms):
>     """Accepts an 8-character string of three two-digit numbers,
> separated by exactly one non-numeric character, and converts it
> to an integer, representing the number of seconds.  Think of
> degree, minute, second notation, or time marked in hours,
> minutes, and seconds (HH:MM:SS)."""
>     return (
>             len(dms) == 8
>         and 00 <= int(dms[0:2]) < 24
>         and dms[2] not in '0123456789'
>         and 00 <= int(dms[3:5]) < 60
>         and dms[5] not in '0123456789'
>         and 00 <= int(dms[6:8]) < 60
>         and int(dms[6:8]) + 60 * (int(dms[3:5]) + 60 * int(dms[0:2]))
>         )

Have you considered time.strptime()?

BTW, your function, given "00:00:00" will return 0 -- you may well have
trouble distinguishing that from False (note that False == 0), without
resorting to ugliness like:

    if result is False ...

Instead of returning False for some errors and letting int() raise an
exception for others, I would suggest raising ValueError yourself for
*all* invalid input.

You may wish to put more restrictions on the separators ... I would be
suspicious of cases where dms[2] != dms[5]. What plausible separators
are there besides ":"? Why allow alphabetics? If there's a use case for
"23h59m59s", that would have to be handled separately. Note that
"06-12-31" could be a date, "12,34,56" could be CSV data.

Cheers,
John




More information about the Python-list mailing list