У меня есть массив, заполненный строкой, которые представляют элементы времени, и я пытаюсь получить общее время из этого массива.


testArray=['02:30:57','15:09:18','01:00:18']
def arraysum(x): 
  if (len(x)%2==0):

     for i in range (0,len(x)-1,2):
            for j in range (1,len(x),2) :
                time2=datetime.strptime(x[i],"%H:%M:%S")
                time1=datetime.strptime(x[j],"%H:%M:%S")
                time1delta=timedelta(hours=time1.hour, minutes=time1.minute, seconds=time1.second)
                time2delta=timedelta(hours=time2.hour, minutes=time2.minute, seconds=time2.second)
                total=time2delta+time1delta
                print (total)


    else:
        for i in range (0,len(x),2):
            for j in range (1,len(x)-1,2) :
                time2=datetime.strptime(x[i],"%H:%M:%S")
                time1=datetime.strptime(x[j],"%H:%M:%S")
                time1delta=timedelta(hours=time1.hour, minutes=time1.minute, seconds=time1.second)
                time2delta=timedelta(hours=time2.hour, minutes=time2.minute, seconds=time2.second)
                total=time2delta+time1delta
                print (total)


arraysum(testArray)

Это вывод, который я получаю, который является неправильным. 17:40:15 16:09:36

Мне нужно, чтобы показать 18:40:15

-1
user2241397 5 Июл 2019 в 16:28

3 ответа

Лучший ответ

Вот еще один способ:

from datetime import timedelta


def f(t):
    result = timedelta()
    for i in t:
        hours, minutes, seconds = i.split(":")
        result += timedelta(
            hours=int(hours), minutes=int(minutes), seconds=int(seconds)
        )
    return result


test = ['02:30:57','15:09:18', '01:00:18']
print(f(test))
# result = 18:40:33
1
dildeolupbiten 5 Июл 2019 в 14:09

Если вы готовы использовать панд, результат станет намного проще, поскольку у панд есть много возможностей для анализа жала в более богатые объекты времени.

import pandas as pd

testArray=['02:30:57','15:09:18','01:00:18']
total_time = sum((pd.Timedelta(t) for t in testArray), pd.Timedelta(0, 's'))

Для печати у вас есть несколько вариантов. str(total_time) возвращает '0 days 18:40:33', total_time.isoformat() возвращает 'P0DT18H40M33S' и repr(total_time) возвращает "Timedelta('0 days 18:40:33')".

Если вы не хотите использовать панд, вы можете сделать небольшую вспомогательную функцию.

import datetime

testArray=['02:30:57','15:09:18','01:00:18']

def parse_timedelta_string(timedelta_string):
    hours, minutes, seconds = map(int, timedelta_string.split(':'))
    return datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)

total_time = sum((parse_timedelta_string(t) for t in testArray), datetime.timedelta(seconds=0))

print(total_time)
0
Kyle Parsons 5 Июл 2019 в 14:16

Используя модуль datetime. Использование datetime.timedelta для увеличения времени.

< Сильный > Пример:

import datetime

testArray=['02:30:57','15:09:18','01:00:18'] 
result = None
for d in testArray:
    if not result:
        result = datetime.datetime.strptime(d, "%H:%M:%S")
    else:
        value = datetime.datetime.strptime(d, "%H:%M:%S")
        result = result + datetime.timedelta(hours=value.hour, minutes=value.minute, seconds=value.second)

print(result.strftime("%H:%M:%S")) #-->18:40:33
2
Rakesh 5 Июл 2019 в 13:32