Given s.ss or seconds accurate to the hundredth place, what is the most effective way to convert it to the string mm:ss.s?

Here is my current attempt:

``````import time

def convert(t):
print time.strftime("%M:%S",time.gmtime(round(t,1)))+str((".%01d" % (((round(t,1))-int(round(t,1)))*10)))

t = float(raw_input('Enter time in s.ss: '))
convert(t)``````

However, the results don't seem quite right:

>>>
Enter time in s.ss: 2.84
00:02.7

It seems like round(t,1) doesn't do its job right:

>>> round(2.84,1)
2.7999999999999998

Any suggestions?

Thank you for your help,
cyon

Other problems:
- strftime doesn't round any of the decimals

Edited by cyon: n/a

3
Contributors
6
Replies
9
Views
8 Years
Discussion Span
Last Post by pyTony

Here is adapted to you and my own use version of timestr function.

Notice that normal use of time for logging etc becomes easier when can put only timestr() for time values and have fuction to make it human understandable. Use example `line+='Processing took '+timestr(t2)+'.\nFinnishing time :' +time.asctime()+'.\n'`

``````import time

def timestr(t):
if t>60: return "%i min %.3f s" % divmod(t,60)
elif t>1: return "%.3f s" % t
else: return "%i ms" % int(t*1000)

def convert(t):
return "%i:%.2f s" % divmod(t,60)

t = float(raw_input('Enter time in s.ss: '))
print convert(t)``````

Edited by pyTony: n/a

Here is adapted to you and my own use version of timestr function.

Notice that normal use of time for logging etc becomes easier when can put only timestr() for time values and have fuction to make it human understandable. Use example `line+='Processing took '+timestr(t2)+'.\nFinnishing time :' +time.asctime()+'.\n'`

``````import time

def timestr(t):
if t>60: return "%i min %.3f s" % divmod(t,60)
elif t>1: return "%.3f s" % t
else: return "%i ms" % int(t*1000)

def convert(t):
return "%i:%.2f s" % divmod(t,60)

t = float(raw_input('Enter time in s.ss: '))
print convert(t)``````

Thank you for your reply and for sharing your code, but it doesn't quite accomplish my original request. I am trying to convert, with appropriate rounding, a float in the format of s.ss to a string that is mm:ss.s, e.g., (using > to denote the conversion)

2.84 > 00:02.8
2.89 > 00:02.9
59.99 > 01:00.0

The need for exactness is due to the fact that the original floats are the racing times of a game.

I am now trying to use divmod and strftime to produce the desired results and will post back if I make any progress...

EDIT:
This seems to work, though lines 5-13 are inelegant:

``````def convert(time):
t = round(time,1)
minutes , seconds = divmod(t , 60)

if minutes < 10:
minutes = '0%.f' % minutes
else:
minutes = '%.f' % minutes

if seconds < 10:
seconds = '0%.1f' % seconds
else:
seconds = '%.1f' % seconds

return "%s:%s" % (minutes , seconds)

time = float(raw_input('Enter time in s.ss: '))
print convert(time)``````

Edited by cyon: n/a

I do not know Pythons standard library yet well, but old BASIC hacker would do

``````""" Desired results
Input  Output
2.84 > 00:02.8
2.89 > 00:02.9
59.99 > 01:00.0
"""
def convert1(t):
## desisecond rounding
t= int(t*10+0.5)  ## add half to get rounding to desisecond (funny unit BTW)
minutes, ds = divmod(t,60*10)
minutes=minutes % 10
s,ds= divmod(ds, 10)
return (minutes,s,ds)

def timestr(minutes,s,ds):
return str(minutes).zfill(2)+':'+str(s).zfill(2)+'.'+str(ds).zfill(1)

for f in [2.84, 2.89, 59.99]:
t=convert1(f) ## get minutes and desiseconds
print f,'->',timestr(*t)
""" Output:
>>>
2.84 -> 00:02.8
2.89 -> 00:02.9
59.99 -> 01:00.0
"""``````

Edited by pyTony: Using of min as variable name is not clever

I do not know Pythons standard library yet well, but old BASIC hacker would do

``````""" Desired results
Input  Output
2.84 > 00:02.8
2.89 > 00:02.9
59.99 > 01:00.0
"""
def convert1(t):
## desisecond rounding
t= int(t*10+0.5)  ## add half to get rounding to desisecond (funny unit BTW)
minutes, ds = divmod(t,60*10)
minutes=minutes % 10
s,ds= divmod(ds, 10)
return (minutes,s,ds)

def timestr(minutes,s,ds):
return str(minutes).zfill(2)+':'+str(s).zfill(2)+'.'+str(ds).zfill(1)

for f in [2.84, 2.89, 59.99]:
t=convert1(f) ## get minutes and desiseconds
print f,'->',timestr(*t)
""" Output:
>>>
2.84 -> 00:02.8
2.89 -> 00:02.9
59.99 -> 01:00.0
"""``````

I suggest

``timestr = "{0:0>2}:{1:0>2}.{2:0>1}".format``

for python >= 2.6

Thanks for the replies and for introducing me to zfill() and string formatting.

Edited by cyon: n/a

Revision of the code

``````def convert(time):
t = round(time,1)
minutes , seconds = divmod(t , 60)

minutes = ('%.f' % minutes).zfill(2)
seconds = ('%.1f' % seconds).zfill(4)
return "%s:%s" % (minutes,seconds)

for f in [2.84, 2.89, 59.99]:print f,'>',convert(f)
"""
>>>
2.84 > 00:02.8
2.89 > 00:02.9
59.99 > 01:00.0
>>> """``````
This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.