Python: 字符串上的 strptime 缺少数据

Python: strptime on a string with missing data

我正在尝试将传达时间量的特定类型的字符串转换为日期时间格式。字符串遵循 1d2h3m4s 格式,如 1 天 2 小时 3 分钟 4 秒。

我目前是这样做的:timeobject = datetime.strptime(time, '%dd%Hh%Mm%Ss') 只要字符串采用该格式,它就可以完美运行。唯一的问题是有时会遗漏一些值,因此它会类似于 2h3m。这不起作用,因为它与格式不匹配:ValueError: time data '2h3m' does not match format '%dd%Hh%Mm%Ss'

我正在寻找的是在缺失的地方添加一个零,这样就不会再发生这种情况,例如将 2h3m 更改为 0d2h3m0s,除非有其他可用的解决方案,在这种情况下我洗耳恭听!

为了按要求修复您的字符串,您可以使用正则表达式提取每个元素并用默认值替换缺失的元素:

import re

time = '2h3m'
out = re.search('(\d+d)?(\d+h)?(\d+m)?(\d+s)?', time).groups()
default = ('0d', '0h', '0m', '0s')
time2 = ''.join(a if a else b for a,b in zip(out, default))

输出:'0d2h3m0s'

NB 或不完全清楚您期望 datetime 的哪个输出是零天不正确,但您可以轻松调整上面的代码

替代获取号码

您也可以提取数字直接在 datetime/timedelta 构造函数中使用:

import re

time = '2h3m'
out = re.search('(\d+d)?(\d+h)?(\d+m)?(\d+s)?', time).groups()
default = (1, 0, 0, 0)
time2 = [int(a[ :-1]) if a else b for a,b in zip(out, default)]

输出:[1, 2, 3, 1]

时间增量

timedelta 构造函数示例:

from datetime import timedelta 

import re
time = '2h3m'
out = re.search('(\d+d)?(\d+h)?(\d+m)?(\d+s)?', time).groups()
default = (0, 0, 0, 0)
d, h, m, s = [int(a[ :-1]) if a else b for a,b in zip(out, default)]
timedelta(d, h*3600+m*60+s)

输出:datetime.timedelta(seconds=7380)