user1617268
user1617268

Reputation: 123

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'

Upvotes: 12

Views: 10133

Answers (3)

ecatmur
ecatmur

Reputation: 157374

Try parsing the hours separately:

hours, rest = time.split(':', 1)
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f")

Upvotes: 3

sloth
sloth

Reputation: 101072

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

Upvotes: 2

Martijn Pieters
Martijn Pieters

Reputation: 1122312

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)

Upvotes: 10

Related Questions