【问题标题】:Python: strptime on a string with missing dataPython:缺少数据的字符串上的strptime
【发布时间】:2021-12-12 04:52:14
【问题描述】:

我正在尝试将传达一定时间量的特定类型的字符串转换为日期时间格式。字符串遵循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,除非有其他可用的解决方案,在这种情况下我会全力以赴!

【问题讨论】:

  • 欢迎来到 Stack Overflow!寻求代码帮助的问题必须包括在问题本身中重现它所需的最短代码,最好是在Stack Snippet 中。请参阅如何创建 Minimal, Reproducible Example。在您的问题中显示预期结果并引用您遇到的任何(确切)错误也非常有帮助。您应该展示自己为解决这个问题所做的任何研究。

标签: python strptime


【解决方案1】:

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

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'

注意或不完全清楚您期望从 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多