Re: average time calculation??
On Thu, 10 Jan 2013 09:50:37 -0800 (PST) pmec pcura...@gmail.com wrote: Hi there guys i've got a script that's suppose to find the average of two times as strings. The times are in minutes:seconds:milliseconds i'm doing ok in printing the right minutes and seconds my problem is with the milliseconds. Example if i have 00:02:20 and 00:04:40 the average will be 00:03:30 or 00:02:00 and 00:03:00 will be 00:02:30 This is how I would probably go about it: Convert your strings to floating point values which describe the time in seconds. Look at string.split() if you do it by hand. You could also use a regular expression ('re' module). Then, calculate the average: (a+b)*0.5 Then, convert back to your string format if you must. This may sound like more work at first but it is probably easier and less error-prone than messing with those separate values. Make sure you properly understand the string format first. minutes:seconds:milliseconds sounds unusual to me, but if you know for certain that is the format, then it is :) -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
On Sun, Jan 13, 2013 at 2:32 AM, Thomas Boell tboell@domain.invalid wrote: This is how I would probably go about it: Convert your strings to floating point values which describe the time in seconds. Either floats or integers (which would be milliseconds, or whatever your smallest unit is). I tend to prefer integers for this sort of work, but do whichever you feel more comfortable working with. ChrisA -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
On 10 January 2013 17:50, pmec pcura...@gmail.com wrote: Hi there guys i've got a script that's suppose to find the average of two times as strings. The times are in minutes:seconds:milliseconds i'm doing ok in printing the right minutes and seconds my problem is with the milliseconds. You might find it easier to do this arithmetic if using datetime.time objects from the datetime module: http://docs.python.org/2/library/datetime.html Example if i have 00:02:20 and 00:04:40 the average will be 00:03:30 or 00:02:00 and 00:03:00 will be 00:02:30 Can anyone help me out with this please. Here is the code that i have so far: def lap_average(lap1, lap2): t1 = lap1.replace(:,'') t2 = lap2.replace(:,'') mins1, secs1, hundreths1 = t1[:2], t1[2:4], t1[4:] mins2, secs2, hundreths2 = t2[:2], t2[2:4], t2[4:] Are these really hundredths? At the top you said it goes minutes:seconds:milliseconds. A hundredth of a second is 10 milliseconds so you need to be clear about which one you want. total_seconds = int(secs1) + int(secs2) + int(mins1) * 60 + int(mins2) * 60 What happened to the hundredths in the line above. Surely you wanted to add 0.01 * hundredths there. millisec = (total_seconds * 1000) millisec = millisec / 2 In Python 2 this division will always round down if millisec is an integer. Is that what you want? micro_x = millisec Is the line above just there to confuse me? I thought millisec was a good descriptive name. In this context micro would suggest microseconds which would be 1000 times smaller. minutes = micro_x / (60*1000) Wouldn't it have been easier to just get this from total_seconds? micro_x = micro_x - minutes * (60*1000) seconds = micro_x / 1000 This will behave differently in Python 3. Safest to use floor division // here: http://stackoverflow.com/questions/183853/in-python-what-is-the-difference-between-and-when-used-for-division micro_x = micro_x - seconds Surely that should be seconds*1000? print '%02d:%02d:%s' % (minutes, seconds, micro_x) Until your done debugging, I suggest you print all of these values out directly (without the format string): print(minutes, seconds, microx) lap_average('03:40:00', '05:20:00') lap_average('03:00:02', '02:00:00') lap_average('02:25:50', '06:50:75') lap_average('00:02:00', '00:03:00') lap_average('00:02:20', '00:04:40') lap_average('02:40:40', '03:30:30') lap_average('02:60:30', '60:40:40') Oscar -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
Two quick corrections to what I wrote... On 10 January 2013 18:13, Oscar Benjamin oscar.j.benja...@gmail.com wrote: On 10 January 2013 17:50, pmec pcura...@gmail.com wrote: Hi there guys i've got a script that's suppose to find the average of two times as strings. The times are in minutes:seconds:milliseconds i'm doing ok in printing the right minutes and seconds my problem is with the milliseconds. You might find it easier to do this arithmetic if using datetime.time objects from the datetime module: http://docs.python.org/2/library/datetime.html Actually I meant datetime.timedelta objects. Example if i have 00:02:20 and 00:04:40 the average will be 00:03:30 or 00:02:00 and 00:03:00 will be 00:02:30 Can anyone help me out with this please. Here is the code that i have so far: def lap_average(lap1, lap2): t1 = lap1.replace(:,'') t2 = lap2.replace(:,'') mins1, secs1, hundreths1 = t1[:2], t1[2:4], t1[4:] mins2, secs2, hundreths2 = t2[:2], t2[2:4], t2[4:] Are these really hundredths? At the top you said it goes minutes:seconds:milliseconds. A hundredth of a second is 10 milliseconds so you need to be clear about which one you want. total_seconds = int(secs1) + int(secs2) + int(mins1) * 60 + int(mins2) * 60 What happened to the hundredths in the line above. Surely you wanted to add 0.01 * hundredths there. millisec = (total_seconds * 1000) millisec = millisec / 2 In Python 2 this division will always round down if millisec is an integer. Is that what you want? micro_x = millisec Is the line above just there to confuse me? I thought millisec was a good descriptive name. In this context micro would suggest microseconds which would be 1000 times smaller. minutes = micro_x / (60*1000) Wouldn't it have been easier to just get this from total_seconds? micro_x = micro_x - minutes * (60*1000) seconds = micro_x / 1000 This will behave differently in Python 3. Safest to use floor division // here: http://stackoverflow.com/questions/183853/in-python-what-is-the-difference-between-and-when-used-for-division micro_x = micro_x - seconds Surely that should be seconds*1000? print '%02d:%02d:%s' % (minutes, seconds, micro_x) micro_x is in units of microseconds. Did you want microseconds or hundredths of a second here in the output? Until your done debugging, I suggest you print all of these values out directly (without the format string): print(minutes, seconds, microx) lap_average('03:40:00', '05:20:00') lap_average('03:00:02', '02:00:00') lap_average('02:25:50', '06:50:75') lap_average('00:02:00', '00:03:00') lap_average('00:02:20', '00:04:40') lap_average('02:40:40', '03:30:30') lap_average('02:60:30', '60:40:40') Oscar -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
On 2013-01-10 17:50, pmec wrote: Hi there guys i've got a script that's suppose to find the average of two times as strings. The times are in minutes:seconds:milliseconds i'm doing ok in printing the right minutes and seconds my problem is with the milliseconds. Example if i have 00:02:20 and 00:04:40 the average will be 00:03:30 or 00:02:00 and 00:03:00 will be 00:02:30 If the final 2 digits are milliseconds, then the second average would be 00:02:500; if they're centiseconds (hundredths of a second), then the second average would be 00:02:50. If the average you give is correct ('00:02:30'), then that suggests that they are in fact hours:minutes:seconds. Can anyone help me out with this please. Here is the code that i have so far: def lap_average(lap1, lap2): t1 = lap1.replace(:,'') t2 = lap2.replace(:,'') mins1, secs1, hundreths1 = t1[:2], t1[2:4], t1[4:] mins2, secs2, hundreths2 = t2[:2], t2[2:4], t2[4:] total_seconds = int(secs1) + int(secs2) + int(mins1) * 60 + int(mins2) * 60 millisec = (total_seconds * 1000) millisec = millisec / 2 micro_x = millisec minutes = micro_x / (60*1000) micro_x = micro_x - minutes * (60*1000) seconds = micro_x / 1000 micro_x = micro_x - seconds print '%02d:%02d:%s' % (minutes, seconds, micro_x) lap_average('03:40:00', '05:20:00') lap_average('03:00:02', '02:00:00') lap_average('02:25:50', '06:50:75') lap_average('00:02:00', '00:03:00') lap_average('00:02:20', '00:04:40') lap_average('02:40:40', '03:30:30') lap_average('02:60:30', '60:40:40') Thanks in Advance I don't see the point of these 2 lines of removing the ':'; slice 'lap1' and 'lap2' instead: mins1, secs1, hundreths1 = lap1[:2], lap1[3:5], lap1[6:] mins2, secs2, hundreths2 = lap2[:2], lap2[3:5], lap2[6:] Better yet, split on ':': mins1, secs1, hundreths1 = lap1.split(':') mins2, secs2, hundreths2 = lap2.split(':') Incidentally, you're talking about milliseconds, but the names say 'hundreths'. A useful function is 'divmod', which, as its name suggests, performs both (integer) division and modulo in one step: seconds, millisec = divmod(millisec, 1000) minutes, seconds = divmod(seconds, 60) -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
Hi Oscar, Thank you for your reply, and you are absolutely right, I meant hundredths of a second to be outputed -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
Hi Oscar, again I do apologize for my beginner mistakes, I've changed the code taking in consideration some of your and MRAB suggestions. Could you give me an example on how could I use the datetime.timedelta function in this particular case. This is my code: def lap_average(lap1, lap2): mins1, secs1, hundreths1 = lap1.split(:) mins2, secs2, hundreths2 = lap2.split(:) minutes = int(mins1) + int(mins2) seconds = float(secs1) + float(secs2) hundredths = int(6 * minutes + 1000 * seconds) hundredths = hundredths // 2 print hundredths lap_average('03:40:00', '05:20:00') lap_average('03:00:02', '02:00:00') lap_average('02:25:50', '06:50:75') lap_average('00:02:00', '00:03:00') #should output: 00:02:50 lap_average('00:02:20', '00:04:40') # 00:03:30 lap_average('02:40:40', '03:30:30') # etc lap_average('02:60:30', '60:40:40') Also I was a bit confused with what you said about : total_seconds = int(secs1) + int(secs2) + int(mins1) * 60 + int(mins2) * 60 What happened to the hundredths in the line above. Surely you wanted to add 0.01 * hundredths there. I thought the above was already the entire time as hundredths of second?? -- http://mail.python.org/mailman/listinfo/python-list
Re: average time calculation??
On Thu, Jan 10, 2013 at 1:31 PM, pmec pcura...@gmail.com wrote: Hi Oscar, again I do apologize for my beginner mistakes, I've changed the code taking in consideration some of your and MRAB suggestions. Could you give me an example on how could I use the datetime.timedelta function in this particular case. td1 = timedelta(minutes=mins1, seconds=secs1, milliseconds=hundredths1*10) td2 = timedelta(minutes=mins2, seconds=secs2, milliseconds=hundredths2*10) average = (td1 + td2) / 2 mins, secs = divmod(average.seconds, 60) hundredths = average.microseconds // 1 print({:02d}:{:02d}:{:02d}.format(mins, secs, hundredths)) -- http://mail.python.org/mailman/listinfo/python-list