如何从一个简单的string构造一个timedelta对象
我正在写一个函数,需要timedeltainput作为string传入。 用户必须input“32m”或“2h32m”,甚至“4:13”或“5hr34m56s”…有没有图书馆或者有这样的东西已经实施?
为4:13,和其他标准格式(但如果你不知道哪一个)从python-dateutil使用dateutil.parser.parse
对于第一种格式(5hr34m56s),您应该使用正则expression式进行parsing
这里是重新解决scheme:
import re from datetime import timedelta regex = re.compile(r'((?P<hours>\d+?)hr)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?') def parse_time(time_str): parts = regex.match(time_str) if not parts: return parts = parts.groupdict() time_params = {} for (name, param) in parts.iteritems(): if param: time_params[name] = int(param) return timedelta(**time_params) >>> from parse_time import parse_time >>> parse_time('12hr') datetime.timedelta(0, 43200) >>> parse_time('12hr5m10s') datetime.timedelta(0, 43510) >>> parse_time('12hr10s') datetime.timedelta(0, 43210) >>> parse_time('10s') datetime.timedelta(0, 10) >>>
对我来说,最优雅的解决scheme,而不必诉诸外部库,如dateutil或手动parsinginput,是使用date时间的强大的strptime
stringparsing方法。
from datetime import datetime, timedelta # we specify the input and the format... t = datetime.strptime("05:20:25","%H:%M:%S") # ...and use datetime's hour, min and sec properties to build a timedelta delta = timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)
在这之后,你可以像平时一样使用你的timedelta对象,把它转换成秒来确保我们做了正确的事情等等。
print(delta) assert(5*60*60+20*60+25 == delta.total_seconds())
昨天我有一些时间在我的手上,所以我把@virhilo的回答发展成了一个Python模块,增加了一些更多的时间expression格式,包括@priestc所要求的。
源代码是在github (麻省理工学院许可证)任何人想要它。 这也是在PyPI上:
pip install pytimeparse
以秒为单位返回时间:
>>> from pytimeparse.timeparse import timeparse >>> timeparse('32m') 1920 >>> timeparse('2h32m') 9120 >>> timeparse('4:13') 253 >>> timeparse('5hr34m56s') 20096 >>> timeparse('1.2 minutes') 72
我想input一个时间,然后将其添加到不同的date,所以这对我工作:
from datetime import datetime as dtt time_only = dtt.strptime('15:30', "%H:%M") - dtt.strptime("00:00", "%H:%M")
如果你使用Python 3,那么这里是Hari Shankar的解决scheme的更新版本,我使用的是:
from datetime import timedelta import re regex = re.compile(r'(?P<hours>\d+?)/' r'(?P<minutes>\d+?)/' r'(?P<seconds>\d+?)$') def parse_time(time_str): parts = regex.match(time_str) if not parts: return parts = parts.groupdict() print(parts) time_params = {} for name, param in parts.items(): if param: time_params[name] = int(param) return timedelta(**time_params)