Re: function to convert degree (hour), minute, seconds string to integer
[EMAIL PROTECTED] 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 -- http://mail.python.org/mailman/listinfo/python-list
Re: function to convert degree (hour), minute, seconds string to integer
On Wed, 2006-07-26 at 20:18 -0700, John Machin wrote: > [EMAIL PROTECTED] 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 > You may also want to look at the dateutil module (especially dateutil.parse). -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. -- http://mail.python.org/mailman/listinfo/python-list
Re: function to convert degree (hour), minute, seconds string to integer
In <[EMAIL PROTECTED]>, John Machin wrote: > 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. Looking at the subject I would expect to be able to give 76°04'54" as argument. Hm, but degrees don't map directly to hours!? Ciao, Marc 'BlackJack' Rintsch -- http://mail.python.org/mailman/listinfo/python-list
Re: function to convert degree (hour), minute, seconds string to integer
John Machin wrote: > [EMAIL PROTECTED] 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 > > 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 Good point about 0/False. I don't think it would have bitten me in my current program, given my expected (and filtered) inputs, but I might have reused it in the future, and been bitten later. I had looked at the time module, but apparently not long enough. This does the trick: def dms2int(dms): int(time.mktime(time.strptime("2000-01-01 %s" % dms, "%Y-%m-%d %H:%M:%S"))) I only need the minutes, but can work with seconds. The only downside is that I'm hardcoding an arbitrary date, but I can deal with that. Thanks for your help, John! --dang -- http://mail.python.org/mailman/listinfo/python-list
Re: function to convert degree (hour), minute, seconds string to integer
[EMAIL PROTECTED] wrote: > John Machin wrote: > > [EMAIL PROTECTED] 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 > > > > 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 > > Good point about 0/False. I don't think it would have bitten me in my > current program, given my expected (and filtered) inputs, but I might > have reused it in the future, and been bitten later. The bigger pain would have been two types of error handling (try/except) *AND* if result is False > > I had looked at the time module, but apparently not long enough. > This does the trick: > > def dms2int(dms): > int(time.mktime(time.strptime("2000-01-01 %s" % dms, "%Y-%m-%d > %H:%M:%S"))) > > I only need the minutes, but can work with seconds. The only downside > is that I'm hardcoding an arbitrary date, but I can deal with that. > That's a bit too elaborate. Python gives you the hard-coded date for free -- then (you ingrate!) you ignore it, like this: |>> import time |>> dms = "23:48:59" |>> t = time.strptime(dms, "%H:%M:%S") |>> t (1900, 1, 1, 23, 48, 59, 0, 1, -1) |>> seconds = (t[3] * 60 + t[4]) * 60.0 + t[5] |>> seconds 85739.0 # assuming you do want it as a float, not an int Cheers, John -- http://mail.python.org/mailman/listinfo/python-list
Re: function to convert degree (hour), minute, seconds string to integer
<[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > 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 In a froth of functionalism, here is my submission. -- Paul tests = """\ 00:00:00 01:01:01 23:59:59 24:00:00 H1:00:00 12:34:56.789""".split("\n") def time2secs(t,decimal=False): if decimal: tflds = map(float,t.split(":")) else: tflds = map(int,t.split(".")[0].split(":")) nomorethan = lambda (a,maxa) : 0 <= a < maxa if sum(map(nomorethan, zip(tflds,(24,60,60 == len(tflds): return reduce(lambda a,b: a*60+b, tflds) else: raise ValueError("invalid time field value in '%s'" % str(t)) for tt in tests: try: print time2secs(tt) print time2secs(tt,True) except Exception,e: print "%s: %s" % (e.__class__.__name__, e) -- http://mail.python.org/mailman/listinfo/python-list