Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I display timedelta in hours:min:sec?

I am exporting a list of timedeltas to csv and the days really messes up the format. I tried this:

 while time_list[count] > datetime.timedelta(days = 1):
        time_list[count] = (time_list[count] - datetime.timedelta(days =  1)) + datetime.timedelta(hours = 24)

But it's instantly converted back into days and creates an infinite loop.

like image 878
John Avatar asked Feb 13 '15 16:02

John


1 Answers

By default the str() conversion of a timedelta will always include the days portion. Internally, the value is always normalised as a number of days, seconds and microseconds, there is no point in trying to 'convert' days to hours because no separate hour component is tracked.

If you want to format a timedelta() object differently, you can easily do so manually:

def format_timedelta(td):
    minutes, seconds = divmod(td.seconds + td.days * 86400, 60)
    hours, minutes = divmod(minutes, 60)
    return '{:d}:{:02d}:{:02d}'.format(hours, minutes, seconds)

This ignores any microseconds portion, but that is trivially added:

return '{:d}:{:02d}:{:02d}.{:06d}'.format(hours, minutes, seconds, td.microseconds)

Demo:

>>> format_timedelta(timedelta(days=2, hours=10, minutes=20, seconds=3))
'58:20:03'
>>> format_timedelta(timedelta(hours=10, minutes=20, seconds=3))
'10:20:03'
like image 195
Martijn Pieters Avatar answered Sep 22 '22 03:09

Martijn Pieters