如何在Python中处理超过24小时的时间值?

12

我正在处理大量同时包含值和时间(以字符串形式)的数据。我使用以下代码将字符串时间值转换为datetime值:

time = datetime.datetime.strptime(time, " %H:%M:%S.%f")

唯一的问题是我的一些数据格式为:24:00:00.004。 因此,一些数据实际上超过了24小时

Python 给我报错:

ValueError: time data ' 24:00:00:004' does not match format ' %H:%M:%S.%f'

3个回答

10

%H 参数只能解析 0 到 23 范围内的值。你需要手动处理这些特定的时间戳:

try:
     time = datetime.datetime.strptime(time, " %H:%M:%S.%f")
except ValueError:
     time = time.replace(' 24', ' 23')
     time = datetime.datetime.strptime(time, " %H:%M:%S.%f")
     time += datetime.timedelta(hours=1)

很幸运的是,在这里小时前有一个空格,可以使用replace而不是一些更丑陋的解决方案,如使用re - mgilson
2
在这种情况下,我会使用'23' + time[2:],也许结合time.startswith('24') - Martijn Pieters
1
.replace() 也有一个 count 参数。我经常使用它来避免意外的二次替换。对于无空格的情况,这也可能起作用。 - DSM

3
尝试分别解析小时部分:
hours, rest = time.split(':', 1)
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f")

2
看起来你的数据不包含日期,而是时间段,所以你可能应该将你的数据存储为 timedelta 而不是 datetime
您可以使用 this 函数从字符串中创建一个 timedelta
import re
from datetime import timedelta

def parseTimeDelta(s):
    d = re.match(
            r'((?P<days>\d+) days, )?(?P<hours>\d+):'
            r'(?P<minutes>\d+):(?P<seconds>\d+)\.(?P<milliseconds>\d+)',
            str(s)).groupdict(0)
    return timedelta(**dict(( (key, int(value))
                              for key, value in d.items() )))

将你的时间字符串'24:00:00.004'像这样解析:

>>>t = parseTimeDelta('24:00:00.04')

会得到一个表示时间差的timedelta,如下所示:

>>> print t
1 天, 0:00:00.004000


%f 匹配微秒,而不是毫秒。不要不必要地调用 str() - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接