Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Formatting timedelta objects [duplicate]

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.

like image 862
Rishav Sharan Avatar asked Jan 18 '12 08:01

Rishav Sharan


People also ask

How do I change Timedelta format in Python?

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.

How do you convert Timedelta to seconds?

To get the Total seconds in the duration from the Timedelta object, use the timedelta. total_seconds() method.

What is the use of Timedelta () function?

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.


1 Answers

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.

like image 179
Shawn Chin Avatar answered Oct 11 '22 20:10

Shawn Chin