Время Python в формате => [дни: часы: минуты: секунды] до секунд

У меня есть эта функция, которая трансформируется, например

timeToSeconds("1:12:45:66.6")
>>>132366.6

Но я признаю, что это не следует концепции DRY, проверьте это:

def timeToSeconds(time):
 t = time.split(':')
 try:
 if len(t) == 1:
 try:
 type(eval(t[0])) in [int, float]
 except:
 return False
 return eval(time)
 elif len(t) == 2:
 return float(t[-1]) + float(t[-2]) * 60
 elif len(t) == 3:
 return float(t[-1]) + float(t[-2]) * 60 + float(t[-3]) * 3600
 elif len(t) == 4:
 return float(t[-1]) + float(t[-2]) * 60 + float(t[-3]) * 3600 + float(t[-4]) * 86400
 else:
 return False
 except:
 return False

Как лучше было бы написать это? Обратите внимание, что это возврат False, когда ввод содержит символы.

3 ответа

Не возвращайте False чтобы указать на ошибку. False == 0.0 в Python. 0.0 - действительный результат для "0:0:0:0.0". Вместо этого вы можете разрешить распространение исключений:

def to_sec(timedelta_string, factors=(1, 60, 3600, 86400)):
 """[[[days:]hours:]minutes:]seconds -> seconds"""
 return sum(x*y for x, y in zip(map(float, timedelta_string.split(':')[::-1]), factors))

Или, если вам нужно подавить исключения, верните None:

def timeToSeconds(time, default=None):
 try:
 return to_sec(time)
 except ValueError:
 return default


Это должно работать,

from datetime import timedelta

def timeToSeconds(s):
 try:
 rparts = reversed(map(float, s.split(':')))
 keys = ['seconds', 'minutes', 'hours', 'days']
 td = timedelta(**dict(zip(keys, rparts)))
 return td.total_seconds()
 except ValueError:
 return False

скрипка


def timeToSeconds(time):
 multi = [1,60,3600,86400]
 try:
 time = map(float,time.split(":"))
 t_ret = 0
 for i,t in enumerate(reversed(time)):
 t_ret += multi[i] * t
 return t_ret
 except ValueError:
 return None

print timeToSeconds("1:12:45:66.6")
print timeToSeconds("12:45:66.6")
print timeToSeconds("45:66.6")
print timeToSeconds("66.6")
print timeToSeconds("c")

Вывод:

132366.6
45966.6
2766.6
66.6
None

licensed under cc by-sa 3.0 with attribution.