Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Working with time values greater than 24 hours

Tags:

python

time

How does one work with time periods greater than 24 hours in python? I looked at the datetime.time object but this seems to be for handling the time of a day, not time in general.

datetime.time has the requirement of 0 <= hour < 24 which makes it useless if you want to record a time of more than 24 hours unless I am missing something?

Say for example I wanted to calculate the total time worked by someone. I know the time they've taken to complete tasks individually. What class should I be using to safely calculate that total time.

My input data would look something like this:

# The times in HH:MM:SS
times = ["16:35:21", "8:23:14"]
total_time = ? # 24:58:35
like image 214
Lerp Avatar asked Aug 18 '13 20:08

Lerp


2 Answers

Unfortunately there is not a builtin way to construct timedeltas from strings (like strptime() for datetime objects) so we have to build a parser:

>>> from datetime import timedelta
>>> import re

>>> def interval(s):
        "Converts a string to a timedelta"
        d = re.match(r'((?P<days>\d+) days, )?(?P<hours>\d+):'
                     r'(?P<minutes>\d+):(?P<seconds>\d+)', str(s)).groupdict(0)
        return timedelta(**dict(((key, int(value)) for key, value in d.items())))

>>> times = ["16:35:21", "8:23:14"]    
>>> print sum([interval(time) for time in times])
1 day, 0:58:35

EDIT: Old wrong answer (where I misread the question):

If you substract datetimes you get a timedelta object:

>>> import datetime as dt

>>> times = ["16:35:21", "8:23:14"]
>>> fmt = '%H:%M:%S'
>>> start = dt.datetime.strptime(times[1], fmt )
>>> end = dt.datetime.strptime(times[0], fmt)
>>> diff = (end - start)

>>> diff.total_seconds()
29527.0

>>> (diff.days, diff.seconds, diff.microseconds)
(0, 29527, 0)

>>> print diff
8:12:07
like image 199
elyase Avatar answered Sep 26 '22 17:09

elyase


As I understand, you want a sum of all times and not difference. So you can convert your time to timedelta and then sum it:

>>> from datetime import timedelta
# get hours, minutes and seconds
>>> tm1 = [map(int, x.split(':')) for x in times]
# convert to timedelta
>>> tm2 = [timedelta(hours=x[0], minutes=x[1], seconds=x[2]) for x in tm1]
# sum
>>> print sum(tm2, timedelta())
1 day, 0:58:35
like image 45
Roman Pekar Avatar answered Sep 25 '22 17:09

Roman Pekar