I have two datetime
objects. I need to calculate the timedelta
between them and then show the output in a specific format.
Alpha_TimeObj = datetime.datetime(int(AlphaTime.strftime('%Y')), int(AlphaTime.strftime('%m')), int(AlphaTime.strftime('%d')), int(AlphaTime.strftime('%H')), int(AlphaTime.strftime('%M')), int(AlphaTime.strftime('%S'))) Beta_TimeObj = datetime.datetime(int(BetaTime.strftime('%Y')), int(BetaTime.strftime('%m')), int(BetaTime.strftime('%d')), int(BetaTime.strftime('%H')), int(BetaTime.strftime('%M')), int(BetaTime.strftime('%S'))) Turnaround_TimeObj = Beta_TimeObj - Alpha_TimeObj
An example of this Turnaround_TimeObj
time delta is "2 days, 22:13:45". I want to format the output, but I am unable to do so.
print Turnaround_TimeObj.strftime('%H hrs %M mins %S secs')
doesn't work.
I know one way of doing this will be to convert it to seconds and then divmoding to get the required formatting.
As in:
totalSeconds = Turnaround_TimeObj.seconds hours, remainder = divmod(totalSeconds, 3600) minutes, seconds = divmod(remainder, 60) print '%s:%s:%s' % (hours, minutes, seconds)
But I was wondering if I can do it in a single line using any date time function like strftime
.
Actually converting to seconds doesn't work either. If I convert the time delta "1 day, 3:42:54" to seconds using:
totalSeconds = Turnaround_TimeObj.seconds
The totalSeconds
value is shown as 13374 instead of 99774. i.e. it's ignoring the "day" value.
Convert String to TimeDelta We can even convert time in string format to datetime by using the strptime() function and then extracting the timedelta information using the timedelta module. We can use the repr(td) to print the timedelta as a constructor with attributes in a string format.
To get the Total seconds in the duration from the Timedelta object, use the timedelta. total_seconds() method.
timedelta() function. Python timedelta() function is present under datetime library which is generally used for calculating differences in dates and also can be used for date manipulations in Python. It is one of the easiest ways to perform date manipulations.
But I was wondering if I can do it in a single line using any date time function like
strftime
.
As far as I can tell, there isn't a built-in method to timedelta
that does that. If you're doing it often, you can create your own function, e.g.
def strfdelta(tdelta, fmt): d = {"days": tdelta.days} d["hours"], rem = divmod(tdelta.seconds, 3600) d["minutes"], d["seconds"] = divmod(rem, 60) return fmt.format(**d)
Usage:
>>> print strfdelta(delta_obj, "{days} days {hours}:{minutes}:{seconds}") 1 days 20:18:12 >>> print strfdelta(delta_obj, "{hours} hours and {minutes} to go") 20 hours and 18 to go
If you want to use a string format closer to the one used by strftime
we can employ string.Template
:
from string import Template class DeltaTemplate(Template): delimiter = "%" def strfdelta(tdelta, fmt): d = {"D": tdelta.days} d["H"], rem = divmod(tdelta.seconds, 3600) d["M"], d["S"] = divmod(rem, 60) t = DeltaTemplate(fmt) return t.substitute(**d)
Usage:
>>> print strfdelta(delta_obj, "%D days %H:%M:%S") 1 days 20:18:12 >>> print strfdelta(delta_obj, "%H hours and %M to go") 20 hours and 18 to go
The
totalSeconds
value is shown as 13374 instead of 99774. I.e. it's ignoring the "day" value.
Note in the example above that you can use timedelta.days
to get the "day" value.
Alternatively, from Python 2.7 onwards, timedelta has a total_seconds() method which return the total number of seconds contained in the duration.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With