Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deal with time values over 24 hours in python?

I'm dealing with a large amount of data that has both values and times(in strings).

I am converting the string time values into datetime values with the following code:

time = datetime.datetime.strptime(time, " %H:%M:%S.%f")

The only problem is that some of my data has the format: 24:00:00.004.
So some of the data is actually over 24 hours

Python is giving me this error: ValueError: time data ' 24:00:00:004' does not match format ' %H:%M:%S.%f'

Any ideas on how to deal with this problem

like image 747
user1617268 Avatar asked Aug 22 '12 14:08

user1617268


3 Answers

The %H parameter can only parse values in the range 0-23. You'll have to manually deal with those specific time stamps:

try:
     time = datetime.datetime.strptime(time, " %H:%M:%S.%f")
except ValueError:
     time = time.replace(' 24', ' 23')
     time = datetime.datetime.strptime(time, " %H:%M:%S.%f")
     time += datetime.timedelta(hours=1)
like image 79
Martijn Pieters Avatar answered Sep 27 '22 19:09

Martijn Pieters


Try parsing the hours separately:

hours, rest = time.split(':', 1)
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f")
like image 21
ecatmur Avatar answered Sep 27 '22 21:09

ecatmur


Seems like your data does not contain dates, but time spans, so you should maybe store your data as timedelta instead of datetime.


You can use this function to create a timedelta from your strings:

import re
from datetime import timedelta

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

Parsing your time string '24:00:00.004' like this

>>>t = parseTimeDelta('24:00:00.04')

would result in a timedelta represented like this

>>> print t
1 day, 0:00:00.004000

like image 33
sloth Avatar answered Sep 27 '22 20:09

sloth