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] 到秒的主要内容,如果未能解决你的问题,请参考以下文章

Python常用时间格式

如何在python中格式化浮点数? [复制]

Python格式接近零的十进制[重复]

python+requests——响应内容以及设置编码格式

使用Python将字符串转换为格式化的日期时间字符串

如何在 Java 中使用占位符进行字符串格式化(如在 Python 中)?