Python Forum
Summing up set elements(HH:MM:SS) - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Summing up set elements(HH:MM:SS) (/thread-39018.html)



Summing up set elements(HH:MM:SS) - tester_V - Dec-21-2022

Greetings to those that are still up! Wink
I'm trying to sum up set elements:
HH:MM:SS
I can do that if the HH:MM:SS elements are in the list but fail if the elements are in the SET.
Here is what I got so far:
import datetime

add_time = ['00:00:15', '0:15:15', '5:15:15']
#add_time = set("00:00:15", "0:15:15", "5:15:15")
add_time = datetime.timedelta()
for i in add_time:
    (h, m, s) = i.split(':')
    d = datetime.timedelta(hours=int(h), minutes=int(m), seconds=int(s))
    add_time += d
print(f" --- {str(add_time)}")[python]
[/python]

Any help is appreciated.
Thank you.


RE: Summing up set elements(HH:MM:SS) - perfringo - Dec-21-2022

You can't create set as it's done on second line (outcommented).

>>> add_time = set("00:00:15", "0:15:15", "5:15:15")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: set expected at most 1 argument, got 3
>>> add_time = ['00:00:15', '0:15:15', '5:15:15']
>>> set(add_time)                                         # you can convert existing list to set
{'00:00:15', '5:15:15', '0:15:15'}
>>> add_time = set(['00:00:15', '0:15:15', '5:15:15'])    # you can provide list directly
>>> add_time
{'00:00:15', '5:15:15', '0:15:15'}                           
As for code itselt - I would write helper function to convert string to datetime object and then map this function to items in set and sum up. Something like:

from datetime import timedelta

add_time = {"00:00:15", "0:15:15", "5:15:15"}

def convert(time_str):
    hrs, mins, secs = (int(unit) for unit in time_str.split(':'))
    return timedelta(hours=hrs, minutes=mins, seconds=secs)

total = sum(map(convert, add_time), timedelta())

# total -> 5:30:45



RE: Summing up set elements(HH:MM:SS) - tester_V - Dec-21-2022

Thank you!
You guys are great!
tster_V


RE: Summing up set elements(HH:MM:SS) - Pedroski55 - Dec-22-2022

Hope perfingo doesn't mind me infringing on his excellent function.

I was interested to see what happens when hour > 23 or time > 23:59:59

from datetime import timedelta

add_time = {"23:00:15", "6:15:15", "5:15:15"}
 
def convert(time_str):
    hrs, mins, secs = (int(unit) for unit in time_str.split(':'))
    return timedelta(hours=hrs, minutes=mins, seconds=secs)
 
total = sum(map(convert, add_time), timedelta())
minute  = 60
hour    = minute * 60
seconds = total.seconds
hours   = divmod(seconds, hour)
minutes = divmod(hours[1], minute)
rem_seconds = minutes[1]
print(f'the total time is {hours[0]}:{minutes[0]}:{minutes[1]}')
Sure enough, looks like you won't get more than 23 hours!


RE: Summing up set elements(HH:MM:SS) - perfringo - Dec-22-2022

It depends what you want. if one wants whole timedelta in seconds then .total_seconds() should be used instead of .seconds:

add_time_2 = {"23:00:15", "6:15:15", "5:15:15"}

total = sum(map(convert, add_time_2), timedelta())

print(total)

# output -> 1 day, 10:30:45

print(total.total_seconds())

# output -> 124245.0 

time = total.total_seconds()

hours, reminder   = divmod(int(time), 3600)
minutes, seconds = divmod(reminder, 60)
print(f'the total time is {hours}:{minutes}:{seconds}')

# output -> the total time is 34:30:45