Search code examples
pythoncsvtimedelta

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.


Solution

  • 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'