Question

I have a string like the following "0:07:38.701" which means 0 hours, 7 minutes, 38 seconds and 701 ms.

I then have a datetime object like the following: datetime.datetime(1945, 1, 3, 11, 45, 0, 44000)

I would like to add these times (the first one is a delta, while the second is an absolute time reference) and get a new datetime.datetime object.

How can I do this?

Was it helpful?

Solution

Once you have a datetime and a timedelta, adding them is as simple as using the + operator:

>>> dt = datetime.datetime(1945, 1, 3, 11, 45, 0, 44000)
>>> td = datetime.timedelta(hours=0, minutes=7, seconds=38.701)
>>> dt + td
datetime.datetime(1945, 1, 3, 11, 52, 38, 745000)

There is no built-in parser for timedelta objects akin to strptime for datetime objects.

You can sometimes fake it by actually parsing the string as a datetime, then extracting the fields to build a timedelta, but this is both hacky and complicated—and, for your simple format, you can write one trivially:

def strpdelta(s):
    hr, min, sec = map(float, s.split(':'))
    return datetime.timedelta(hours=hr, minutes=min, seconds=sec)

OTHER TIPS

You can use a time delta:

>>> import datetime, re
>>> s = "0:07:38.701"
>>> hours, minutes, seconds = [float(val) for val in s.split(':')]
>>> delta = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)
>>> datetime.datetime(1945, 1, 3, 11, 45, 0, 44000) + delta
datetime.datetime(1945, 1, 3, 11, 52, 38, 745000)

EDIT: As pointed out in the comment, timedelta can handle float values. i.e. if seconds=38.701, it will convert it to seconds and milliseconds

from datetime import timedelta, datetime

dtime = datetime(1945, 1, 3, 11, 45, 0, 44000)
str = "0:07:38.701"

elems = str.split(':')
hr, min, sec= int(elems[0]), int(elems[1]), float(elems[2])

tdelta = timedelta(hours=hr, minutes=min, seconds=sec)

new_datetime = dtime + tdelta

Version before edit:

from datetime import timedelta, datetime

dtime = datetime(1945, 1, 3, 11, 45, 0, 44000)
str = "0:07:38.701"

stuff = str.split(':')
elems = stuff[:-1] + stuff[2].split('.')
hr, min, sec, mls= int(elems[0]), int(elems[1]), int(elems[2], int(elems[3]))

tdelta = timedelta(hours=hr, minutes=min, seconds=sec, milliseconds=mls)

new_datetime = dtime + tdelta

One more solution, and my favorite so far since it requires no manual parsing and uses existing functionality in datetime to parse dates in string format:

# Input times:
init_time       =  datetime.datetime(1945, 1, 3, 11, 45, 0, 44000)
time_to_add_str = '0:00:05.00'

# Adding them up:
time_to_add = datetime.strptime(time_to_add_str, '%H:%M:%S.%f') - datetime(1900,1,1)
final_time  = time_to_add  + init_time
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top