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 6 Years Ago by cyon: 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)

Edited 6 Years Ago 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 6 Years Ago 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 6 Years Ago 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 6 Years Ago 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.