delta time = time stop - time start

Dan Bishop danb_83 at yahoo.com
Mon Jan 26 07:06:26 EST 2004


engsol <engsolnorm at ipns.com> wrote in message news:<cs9910pcgktdrp1e8abctoptue7braqvqu at 4ax.com>...
> I'm using Python to parse a bunch of s/w test files and make csv files for later report generation by MS ACCESS....(my boss
> loves the quick turn-around compared to C). Each log file may contain one or more 'sessions', and each session may contain
> one or more 'nodes'.
> 
> Each session in the log has an ASCII  start and stop time, as does each node.
> I have the basic parse part done for parameters, errors, etc., but noticed my routine for determining how long each
> session/node took (delta time) was a bit repetitive, so decided to make a 'stand-alone' routine to handle this.
> 
> The time format from the log is in the format of:
> hh:mm:ss
> and is a string with leading zeros where appropiate. Date is never a factor. The longest "delta" is maybe 5 hours.
> 
> The routine I came up with is below, but seems a bit clunky.
> Is there a better way of doing this? I think it relies too much on integers rounding off in the proper direction, a la
> d_time_hr = d_time / 3600 below.

It also relies on -Qold.  Please use the // operator for integer
division.  Or you're going to regret it when you upgrade to Python
3.0.

> Also, this will have to transition to Linux, if that makes a difference.

In your code, it makes no difference.  I'm using a Linux box right
now.

> START CODE:
> 
> import string

Unless you have a very old version of Python, this is no longer
needed; string.atoi has been officially replaced with the "int"
constructor.

> def deltatime(start, stop):
> 
>     t_start = (string.atoi(start[0:2]) * 3600) + (string.atoi(start[3:5]) * 60) + string.atoi(start[6:8])
>     t_stop  = (string.atoi(stop [0:2]) * 3600) + (string.atoi(stop [3:5]) * 60) + string.atoi(stop [6:8])

Rather than count character positions, take advantage of the fact that
the strings are colon-delimited.

      def toSeconds(timeString):
         hour, min, sec = map(int, timeString.split(':'))
         return (hour * 60 + min) * 60 + sec

      t_start = toSeconds(start)
      t_stop  = toSeconds(stop)
      
>     if t_start < t_stop:
>         d_time = t_stop - t_start
>     else:
>         d_time = (86400 - t_start) + t_stop

You can eliminate the if-else test by taking advantage of Python's %
operator

      d_time = (t_stop - t_start) % 86400

>     d_time_hr  =  d_time / 3600
>     d_time_min = (d_time - d_time_hr * 3600) / 60
>     d_time_sec = (d_time - d_time_hr * 3600) - (d_time_min * 60)

Rather than calculate remainders the hard way, use the % operator.  Or
since you need both the quotient and remainder, use the divmod
function.

      d_time_min, d_time_sec = divmod(d_time, 60)
      d_time_hr, d_time_min = divmod(d_time_min, 60)

>     return str(d_time_hr) + 'hr ' + str(d_time_min) + 'min ' + str(d_time_sec) + 'sec'

A more concise way of writing this is

      return '%dhr %dmin %ssec' % (d_time_hr, d_time_min, d_time_sec)

The complete rewritten function is

def deltatime(start, stop):
   def toSeconds(timeString):
      hour, min, sec = map(int, timeString.split(':'))
      return (hour * 60 + min) * 60 + sec
   t_start = toSeconds(start)
   t_stop  = toSeconds(stop)
   d_time = (t_stop - t_start) % 86400
   d_time_min, d_time_sec = divmod(d_time, 60)
   d_time_hr, d_time_min = divmod(d_time_min, 60)
   return '%dhr %dmin %ssec' % (d_time_hr, d_time_min, d_time_sec)

which is still too verbose for my tastes; I would rewrite it as:

def deltatime(start, stop):
   def toSeconds(timeString):
      hour, min, sec = map(int, timeString.split(':'))
      return (hour * 60 + min) * 60 + sec
   d_time_min, d_time_sec = divmod(toSeconds(stop) - toSeconds(start),
60)
   d_time_hr, d_time_min = divmod(d_time_min, 60)
   return '%dhr %dmin %ssec' % (d_time_hr % 24, d_time_min,
d_time_sec)



More information about the Python-list mailing list