Basically I have the inverse of this problem: Python Time Seconds to h:m:s
I have a string in the format H:MM:SS [always 2 digits for minutes and seconds], and I need the integer number of seconds that it represents. How can I do this in python?
For example:
- "1:23:45" would produce an output of 5025
- "0:04:15" would produce an output of 255
- "0:00:25" would produce an output of 25
etc
asked Jun 19, 2011 at 14:05
1
def get_sec[time_str]:
"""Get seconds from time."""
h, m, s = time_str.split[':']
return int[h] * 3600 + int[m] * 60 + int[s]
print[get_sec['1:23:45']]
print[get_sec['0:04:15']]
print[get_sec['0:00:25']]
LeopardShark
2,8922 gold badges18 silver badges31 bronze badges
answered Jun 19, 2011 at 14:11
taskinoortaskinoor
44.9k12 gold badges116 silver badges139 bronze badges
0
ts = '1:23:45'
secs = sum[int[x] * 60 ** i for i, x in enumerate[reversed[ts.split[':']]]]
print[secs]
answered Jun 19, 2011 at 14:22
FMcFMc
41.2k13 gold badges76 silver badges131 bronze badges
4
Using datetime module
import datetime
t = '10:15:30'
h,m,s = t.split[':']
print[int[datetime.timedelta[hours=int[h],minutes=int[m],seconds=int[s]].total_seconds[]]]
Output: 36930
answered May 14, 2014 at 22:52
kaushkaush
1611 silver badge7 bronze badges
3
Without many checks, and assuming it's either "SS" or "MM:SS" or "HH:MM:SS" [although not necessarily two digits per part]:
def to_seconds[timestr]:
seconds= 0
for part in timestr.split[':']:
seconds= seconds*60 + int[part, 10]
return seconds
>>> to_seconds['09']
9
>>> to_seconds['2:09']
129
>>> to_seconds['1:02:09']
3729
This is a different “spelling” of FMc's answer :]
answered Jun 19, 2011 at 14:46
tzottzot
89k29 gold badges136 silver badges200 bronze badges
2
Using datetime
module is also posible and more robust
import datetime as dt
def get_total_seconds[stringHMS]:
timedeltaObj = dt.datetime.strptime[stringHMS, "%H:%M:%S"] - dt.datetime[1900,1,1]
return timedeltaObj.total_seconds[]
datetime.strptime
parses the string according to format %H:%M:%S, and it creates a datetime object as year 1900, month2, day 1, hour H, minute M, and second S.
That's why to get the total of seconds is necessary to subtract the year, month and day.
print[get_total_seconds['1:23:45']]
>>> 5025.0
print[get_total_seconds['0:04:15']]
>>> 255.0
print[get_total_seconds['0:00:25']]
>>>25.0
answered May 19, 2020 at 11:52
1
You can use lambda and reduce a list and the fact that m=60s and h=60m. [see "Reducing a List" at //www.python-course.eu/lambda.php]
timestamp = "1:23:45"
seconds = reduce[lambda x, y: x*60+y, [int[i] for i in [timestamp.replace[':',',']].split[',']]]
answered Apr 8, 2017 at 15:53
You can split the time into a list and add each individual time component, multiplying the hours component by 3600 [the number of seconds in an hour] and the minutes component by 60 [number of seconds in a minute], like:
timeInterval ='00:35:01'
list = timeInterval.split[':']
hours = list[0]
minutes = list[1]
seconds = list[2]
total = [int[hours] * 3600 + int[minutes] * 60 + int[seconds]]
print["total = ", total]
answered Aug 24, 2018 at 9:46
For %H:%M:%S.%f
def get_sec[time_str]:
h, m, s = time_str.split[':']
return int[h] * 3600 + int[m] * 60 + float[s]
answered Sep 9, 2021 at 9:40
parts = time_string.split[":"]
seconds = int[parts[0]]*[60*60] + int[parts[1]]*60 + int[parts[2]]
answered Jun 19, 2011 at 14:10
DaClownDaClown
3,8916 gold badges30 silver badges30 bronze badges
1
I didn't really like any of the given answers, so I used the following:
def timestamp_to_seconds[t]:
return sum[float[n] * m for n,
m in zip[reversed[time.split[':']], [1, 60, 3600]]
]
JayRizzo
2,7843 gold badges31 silver badges42 bronze badges
answered Aug 30, 2017 at 23:18
0
Expanding on @FMc's solution which embodies half of Horner's method. Advantage of Horner's method: Skip reversing the list, avoid power calculation.
from functools import reduce
timestamp = "1:23:45"
seconds = reduce[lambda s, d: s * 60 + int[d], timestamp.split[":"], 0]
or, if you dislike reduce [as does Guido van Rossum and @0xc0de below]:
timestamp = "1:23:45"
seconds = 0
for d in timestamp.split[":"]:
seconds = seconds * 60 + int[d]
If you prefer zip [as does @nathan-rice below]:
from itertools import accumulate, repeat
from operator import mul
def timestamp_to_seconds[t]:
return sum[int[n] * m for n, m in
zip[reversed[t.split[":"]], accumulate[repeat[60], func=mul, initial=1]]]
answered Aug 22, 2019 at 13:12
1
Another alternative if you have days on string:
def duration2sec[string]:
if "days" in string:
days = string.split[][0]
hours = string.split[][2].split[':']
return int[days] * 86400 + int[hours[0]] * 3600 + int[hours[1]] * 60 + int[hours[2]]
else:
hours = string.split[':']
return int[hours[0]] * 3600 + int[hours[1]] * 60 + int[hours[2]]
answered Oct 15, 2014 at 23:47
ItaluxItalux
751 gold badge1 silver badge9 bronze badges
2
Just a simple generalization to the great response of taskinoor
In the context of my problem the format is similar, but includes AM or PM.
Format 'HH:MM:SS AM' or 'HH:MM:SS PM'
For this case the function changes to:
def get_sec[time_str]:
"""Get Seconds from time."""
if 'AM' in time_str:
time_str = time_str.strip['AM']
h, m, s = time_str.split[':']
seconds = int[h] * 3600 + int[m] * 60 + int[s]
if 'PM' in time_str:
time_str = time_str.strip['PM']
h, m, s = time_str.split[':']
seconds = [12 + int[h]] * 3600 + int[m] * 60 + int[s]
return seconds
answered Nov 16, 2020 at 20:18
In Pandas using @JayRizzo 's cool function and a list comprehension:
def get_sec[time_str]:
"""Get Seconds from time."""
h, m, s = time_str.split[':']
return int[h] * 3600 + int[m] * 60 + int[s]
df['secs']=[get_sec[x] for x in df['original_time_string']]
Sven Eberth
2,97312 gold badges22 silver badges27 bronze badges
answered Jun 22, 2021 at 18:38