很好的问题,显然“正确”的解决方案取决于您对输入的期望(更可靠的数据源不需要太多的输入验证)。
我的方法是解析ISO8601持续时间戳,只检查“PT”前缀是否存在,并且不会假定任何单位的整数值:
from datetime import timedelta
def parse_isoduration(isostring, as_dict=False):
"""
Parse the ISO8601 duration string as hours, minutes, seconds
"""
separators = {
"PT": None,
"W": "weeks",
"D": "days",
"H": "hours",
"M": "minutes",
"S": "seconds",
}
duration_vals = {}
for sep, unit in separators.items():
partitioned = isostring.partition(sep)
if partitioned[1] == sep:
isostring = partitioned[2]
if sep == "PT":
continue
dur_str = partitioned[0]
dur_val = float(dur_str) if "." in dur_str else int(dur_str)
duration_vals.update({unit: dur_val})
else:
if sep == "PT":
raise ValueError("Missing PT prefix")
else:
duration_vals.update({unit: 0})
if as_dict:
return duration_vals
else:
return tuple(duration_vals.values())
dur_isostr = "PT3H2M59.989333S"
dur_tuple = parse_isoduration(dur_isostr)
dur_dict = parse_isoduration(dur_isostr, as_dict=True)
td = timedelta(**dur_dict)
s = td.total_seconds()
⇣
>>> dur_tuple
(0, 0, 3, 2, 59.989333)
>>> dur_dict
{'weeks': 0, 'days': 0, 'hours': 3, 'minutes': 2, 'seconds': 59.989333}
>>> td
datetime.timedelta(seconds=10979, microseconds=989333)
>>> s
10979.989333
datetime.timedelta
对象。标准库没有解析时间差的功能,但是在PyPI上有一些包可以通过pip install
安装。如果你想知道如何自己做,我认为这个问题太广泛了,不适合在SO上提问;你应该自己尝试一下,看看在哪里(如果有的话)卡住了无法继续。 - jonrsharpedatetime.timedelta
是什么?它是一个包的一部分吗?你能举个具体的例子说明你想要的和你得到的有什么不同吗? - SherylHohman