Python summing up time

后端 未结 9 1673
后悔当初
后悔当初 2020-12-06 00:55

In python how do I sum up the following time?

 0:00:00
 0:00:15
 9:30:56
相关标签:
9条回答
  • 2020-12-06 00:59

    Bellow is a solution using list comprehension:

    from datetime import timedelta
    
    def time_sum(time: List[str]) -> timedelta:
        """
        Calculates time from list of time hh:mm:ss format
        """
    
        return sum(
            [
                timedelta(hours=int(ms[0]), minutes=int(ms[1]), seconds=int(ms[2]))
                for t in time
                for ms in [t.split(":")]
            ],
            timedelta(),
        )
    

    Example:

    time_list = ["0:00:00", "0:00:15", "9:30:56"]
    total = time_sum(time_list)
    print(f"Total time: {total}")
    
    0 讨论(0)
  • 2020-12-06 01:00

    It depends on the form you have these times in, for example if you already have them as datetime.timedeltas, then you could just sum them up:

    >>> s = datetime.timedelta(seconds=0) + datetime.timedelta(seconds=15) + datetime.timedelta(hours=9, minutes=30, seconds=56)
    >>> str(s)
    '9:31:11'
    
    0 讨论(0)
  • 2020-12-06 01:00

    I'm really disappointed if there is not any more pythonic solution... :(

    Horrible one ->

    timeList = [ '0:00:00', '0:00:15', '9:30:56' ]
    
    ttt = [map(int,i.split()[-1].split(':')) for i in timeList]
    seconds=reduce(lambda x,y:x+y[0]*3600+y[1]*60+y[2],ttt,0)
    #seconds == 34271
    

    This one looks horrible too ->

    zero_time = datetime.datetime.strptime('0:0:0', '%H:%M:%S')
    ttt=[datetime.datetime.strptime(i, '%H:%M:%S')-zero_time for i in timeList]
    delta=sum(ttt,zero_time)-zero_time
    # delta==datetime.timedelta(0, 34271)
    
    # str(delta)=='9:31:11' # this seems good, but 
    # if we have more than 1 day we get for example str(delta)=='1 day, 1:05:22'
    

    Really frustrating is also this ->

    sum(ttt,zero_time).strftime('%H:%M:%S')  # it is only "modulo" 24 :( 
    

    I really like to see one-liner so, I tried to make one in python3 :P (good result but horrible look)

    import functools
    timeList = ['0:00:00','0:00:15','9:30:56','21:00:00'] # notice additional 21 hours!
    sum_fnc=lambda ttt:(lambda a:'%02d:%02d:%02d' % (divmod(divmod(a,60)[0],60)+(divmod(a,60)[1],)))((lambda a:functools.reduce(lambda x,y:x+y[0]*3600+y[1]*60+y[2],a,0))((lambda a:[list(map(int,i.split()[-1].split(':'))) for i in a])(ttt)))
    # sum_fnc(timeList) -> '30:40:11'
    
    0 讨论(0)
  • 2020-12-06 01:03

    As a list of strings?

    timeList = [ '0:00:00', '0:00:15', '9:30:56' ]
    totalSecs = 0
    for tm in timeList:
        timeParts = [int(s) for s in tm.split(':')]
        totalSecs += (timeParts[0] * 60 + timeParts[1]) * 60 + timeParts[2]
    totalSecs, sec = divmod(totalSecs, 60)
    hr, min = divmod(totalSecs, 60)
    print "%d:%02d:%02d" % (hr, min, sec)
    

    Result:

    9:31:11
    
    0 讨论(0)
  • 2020-12-06 01:07

    Using timedeltas (tested in Python 3.4):

    import datetime
    
    timeList = ['0:00:00', '0:00:15', '9:30:56']
    sum = datetime.timedelta()
    for i in timeList:
        (h, m, s) = i.split(':')
        d = datetime.timedelta(hours=int(h), minutes=int(m), seconds=int(s))
        sum += d
    print(str(sum))
    

    Result:

    9:31:11
    
    0 讨论(0)
  • 2020-12-06 01:07

    Assuming you want to add up the seconds for a total time:

    def parse_time(s):
        hour, min, sec = s.split(':')
        try:
            hour = int(hour)
            min = int(min)
            sec = int(sec)
        except ValueError:
            # handle errors here, but this isn't a bad default to ignore errors
            return 0
        return hour * 60 * 60 + min * 60 + sec
    
    print parse_time('0:00:00') + parse_time('0:00:15') + parse_time('9:30:56')
    
    0 讨论(0)
提交回复
热议问题