Re: average time calculation??

2013-01-12 Thread Thomas Boell
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??

2013-01-12 Thread Chris Angelico
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??

2013-01-10 Thread Oscar Benjamin
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??

2013-01-10 Thread Oscar Benjamin
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??

2013-01-10 Thread MRAB

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??

2013-01-10 Thread pmec
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??

2013-01-10 Thread pmec
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??

2013-01-10 Thread Ian Kelly
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