How to convert a time string to seconds?

PythonTimePython Datetime

Python Problem Overview


I need to convert time value strings given in the following format to seconds, for example:

1.'00:00:00,000' -> 0 seconds

2.'00:00:10,000' -> 10 seconds

3.'00:01:04,000' -> 64 seconds

4.'01:01:09,000' -> 3669 seconds

Do I need to use regex to do this? I tried to use the time module, but

time.strptime('00:00:00,000','%I:%M:%S')

throws:

ValueError: time data '00:00:00,000' does not match format '%I:%M:%S'

Edit:

Looks like this:

from datetime import datetime
pt = datetime.strptime(timestring,'%H:%M:%S,%f')
total_seconds = pt.second + pt.minute*60 + pt.hour*3600

gives the correct result. I was just using the wrong module.

Python Solutions


Solution 1 - Python

>>> import datetime
>>> import time
>>> x = time.strptime('00:01:00,000'.split(',')[0],'%H:%M:%S')
>>> datetime.timedelta(hours=x.tm_hour,minutes=x.tm_min,seconds=x.tm_sec).total_seconds()
60.0

Solution 2 - Python

A little more pythonic way I think would be:

timestr = '00:04:23'

ftr = [3600,60,1]

sum([a*b for a,b in zip(ftr, map(int,timestr.split(':')))])

Output is 263Sec.

I would be interested to see if anyone could simplify it further.

Solution 3 - Python

without imports

time = "01:34:11"
sum(x * int(t) for x, t in zip([3600, 60, 1], time.split(":"))) 

Solution 4 - Python

To get the timedelta(), you should subtract 1900-01-01:

>>> from datetime import datetime
>>> datetime.strptime('01:01:09,000', '%H:%M:%S,%f')
datetime.datetime(1900, 1, 1, 1, 1, 9)
>>> td = datetime.strptime('01:01:09,000', '%H:%M:%S,%f') - datetime(1900,1,1)
>>> td
datetime.timedelta(0, 3669)
>>> td.total_seconds() # 2.7+
3669.0

%H above implies the input is less than a day, to support the time difference more than a day:

>>> import re
>>> from datetime import timedelta
>>> td = timedelta(**dict(zip("hours minutes seconds milliseconds".split(),
...                           map(int, re.findall('\d+', '31:01:09,000')))))
>>> td
datetime.timedelta(1, 25269)
>>> td.total_seconds()
111669.0

To emulate .total_seconds() on Python 2.6:

>>> from __future__ import division
>>> ((td.days * 86400 + td.seconds) * 10**6 + td.microseconds) / 10**6
111669.0

Solution 5 - Python

It looks like you're willing to strip fractions of a second... the problem is you can't use '00' as the hour with %I

>>> time.strptime('00:00:00,000'.split(',')[0],'%H:%M:%S')
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)
>>>

Solution 6 - Python

def time_to_sec(t):
   h, m, s = map(int, t.split(':'))
   return h * 3600 + m * 60 + s

t = '10:40:20'
time_to_sec(t)  # 38420

Solution 7 - Python

There is always parsing by hand

>>> import re
>>> ts = ['00:00:00,000', '00:00:10,000', '00:01:04,000', '01:01:09,000']
>>> for t in ts:
...     times = map(int, re.split(r"[:,]", t))
...     print t, times[0]*3600+times[1]*60+times[2]+times[3]/1000.
... 
00:00:00,000 0.0
00:00:10,000 10.0
00:01:04,000 64.0
01:01:09,000 3669.0
>>> 

Solution 8 - Python

import time
from datetime import datetime

t1 = datetime.now().replace(microsecond=0)
time.sleep(3)
now = datetime.now().replace(microsecond=0)
print((now - t1).total_seconds())

result: 3.0

Solution 9 - Python

Inspired by sverrir-sigmundarson's comment:

def time_to_sec(time_str):
    return sum(x * int(t) for x, t in zip([1, 60, 3600], reversed(time_str.split(":"))))

Solution 10 - Python

def time_to_sec(time):
	sep = ','
	rest = time.split(sep, 1)[0]
	splitted = rest.split(":")
	emel = len(splitted) - 1
	i = 0
	summa = 0
	for numb in splitted:
		szor = 60 ** (emel - i)
		i += 1
		summa += int(numb) * szor
	return summa

Solution 11 - Python

Dynamic solution for HH:MM:SS and MM:SS. If you want to handle a command, use split(',') divide by 1000 or something and then add.

_time = 'SS'
_time = 'MM:SS'
_time = 'HH:MM:SS'
seconds = sum(int(x) * 60 ** i for i, x in enumerate(reversed(_time.split(':'))))
# multiple timestamps
_times = ['MM:SS', 'HH:MM:SS', 'SS']
_times = [sum(int(x) * 60 ** i for i, x in enumerate(reversed(_time.split(':')))) for _time in times]

Solution 12 - Python

Why not use functools.reduce?

from functools import reduce

def str_to_seconds(t):
    reduce(lambda prev, next: prev * 60 + next, [float(x) for x in t.replace(',', '.').split(":")], 0)

One function, works on either 10,40, 09:12,40 or 02:08:14,59. If you use . instead of , for decimal sign it's even more simpler:

def str_to_seconds(t):
    reduce(lambda prev, next: prev * 60 + next, [float(x) for x in t.split(":")], 0)

Solution 13 - Python

.total_seconds() seems to be straightforward.

from datetime import datetime

FMT = '%H:%M:%S.%f'

#example
s2 = '11:01:49.897'
s1 = '10:59:26.754'

# calculate difference
pt = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)

# compute seconds number (answer)
total_seconds = pt.total_seconds()
# output: 143.143

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondamonView Question on Stackoverflow
Solution 1 - PythonBurhan KhalidView Answer on Stackoverflow
Solution 2 - Pythonuser1721943View Answer on Stackoverflow
Solution 3 - PythonthafritzView Answer on Stackoverflow
Solution 4 - PythonjfsView Answer on Stackoverflow
Solution 5 - PythonMike PenningtonView Answer on Stackoverflow
Solution 6 - PythonPiotrView Answer on Stackoverflow
Solution 7 - PythonNick Craig-WoodView Answer on Stackoverflow
Solution 8 - PythonSoheil KarshenasView Answer on Stackoverflow
Solution 9 - PythonYScharfView Answer on Stackoverflow
Solution 10 - PythonDaWeView Answer on Stackoverflow
Solution 11 - PythonElijahView Answer on Stackoverflow
Solution 12 - PythonTianyi ShiView Answer on Stackoverflow
Solution 13 - PythonReda El HailView Answer on Stackoverflow