Python 时间格式 => [days:hours:minutes:seconds] 到秒
Posted
技术标签:
【中文标题】Python 时间格式 => [days:hours:minutes:seconds] 到秒【英文标题】:Python time in format => [days:hours:minutes:seconds] to seconds 【发布时间】:2014-12-25 21:02:00 【问题描述】:我有这个功能可以转换例如
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。
【问题讨论】:
秒怎么比 60 大??? 是输入h:m:s:ms还是d:h:m:s? 【参考方案1】:这应该可行,
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
Fiddle
【讨论】:
不正确。尝试从问题中输入。您应该返回td.total_seconds()
。另外,你不需要reversed()
:timedelta(**dict(zip("days:hours:minutes:seconds".split(":"), map(float, s.split(':'))))).total_seconds()
它不计算天数... timeToSeconds("1:0:0:0") => 0
@FilipeTeixeira 我错过了total_seconds()
。补充说。现在可以了。
@J.F.Sebastian reversed 是必要的,否则 1:0
将返回 86400
而不是 60
@EOL 同意你的看法。 list
这里不需要。【参考方案2】:
不要返回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
【讨论】:
@FilipeTeixeira:我已经更新了答案以支持[[[days:]hours:]minutes:]seconds
输入
使用内置函数比手动算术更好。如果你把它写成长的单行,代码也不是那么可读。
@shiplu.mokadd.im:没有必要投反对票。该代码正确简单,比您的解决方案更有效。使用 timedelta
不会带来任何结果。【参考方案3】:
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
【讨论】:
以上是关于Python 时间格式 => [days:hours:minutes:seconds] 到秒的主要内容,如果未能解决你的问题,请参考以下文章