Câu trả lời:
Đối với định dạng đầu tiên (5hr34m56s), bạn nên phân tích cú pháp bằng cách sử dụng biểu thức chính quy
Đây là giải pháp dựa trên cơ sở lại:
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)
>>>
dateutil.parser.parse
sẽ không phân tích cú pháp timedelta
các đối tượng. Nó trả về một datetime
và nó sẽ kích hoạt một ngoại lệ cho các chuỗi như '28:32:11.10'
.
Đối với tôi, giải pháp tốt nhất mà không cần phải sử dụng đến các thư viện bên ngoài như dateutil hoặc phân tích cú pháp đầu vào theo cách thủ công, là sử dụng phương pháp phân tích chuỗi mạnh mẽ của datetimestrptime
.
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)
Sau đó, bạn có thể sử dụng đối tượng hẹn giờ của mình như bình thường, chuyển đổi nó thành giây để đảm bảo chúng tôi đã làm đúng, v.v.
print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
datetime.strptime("32:20:25","%H:%M:%S")
không hoạt động) và bạn phải biết định dạng đầu vào chính xác.
timedelta
tham số khá khó chịu, nhưng cách tốt nhất tôi có thể nghĩ ra để tránh điều này là delta = t - datetime.combine(t.date(), time.min)
:, thật ... kinh khủng.
Tôi đã có một chút thời gian vào ngày hôm qua, vì vậy tôi đã phát triển câu trả lời của @virhilo thành một mô-đun Python, thêm một vài định dạng biểu thức thời gian nữa, bao gồm tất cả những định dạng mà @priestc yêu cầu .
Mã nguồn có trên github (Giấy phép MIT) cho bất kỳ ai muốn nó. Nó cũng có trên PyPI:
pip install pytimeparse
Trả về thời gian dưới dạng một số giây:
>>> from pytimeparse.timeparse import timeparse
>>> timeparse('32m')
1920
>>> timeparse('2h32m')
9120
>>> timeparse('4:13')
253
>>> timeparse('5hr34m56s')
20096
>>> timeparse('1.2 minutes')
72
Tôi chỉ muốn nhập một thời gian và sau đó thêm nó vào các ngày khác nhau để điều này phù hợp với tôi:
from datetime import datetime as dtt
time_only = dtt.strptime('15:30', "%H:%M") - dtt.strptime("00:00", "%H:%M")
dtt.strptime(myduration, "%H:%M:%S") - dtt(1900, 1, 1)
cũng hoạt động ...
Tôi đã sửa đổi câu trả lời hay của virhilo với một vài nâng cấp:
3m0.25s
3 phút, 0,25 giây).
import re
from datetime import timedelta
regex = re.compile(r'^((?P<days>[\.\d]+?)d)?((?P<hours>[\.\d]+?)h)?((?P<minutes>[\.\d]+?)m)?((?P<seconds>[\.\d]+?)s)?$')
def parse_time(time_str):
"""
Parse a time string e.g. (2h13m) into a timedelta object.
Modified from virhilo's answer at https://stackoverflow.com/a/4628148/851699
:param time_str: A string identifying a duration. (eg. 2h13m)
:return datetime.timedelta: A datetime.timedelta object
"""
parts = regex.match(time_str)
assert parts is not None, "Could not parse any time information from '{}'. Examples of valid strings: '8h', '2d8h5m20s', '2m4s'".format(time_str)
time_params = {name: float(param) for name, param in parts.groupdict().items() if param}
return timedelta(**time_params)
Nếu bạn sử dụng Python 3 thì đây là phiên bản cập nhật cho giải pháp của Hari Shankar, mà tôi đã sử dụng:
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)
Django đi kèm với chức năng tiện ích parse_duration()
. Từ tài liệu :
Phân tích cú pháp một chuỗi và trả về a
datetime.timedelta
.Yêu cầu dữ liệu ở định dạng
"DD HH:MM:SS.uuuuuu"
hoặc theo chỉ định của ISO 8601 (ví dụ:P4DT1H15M20S
tương đương với4 1:15:20
) hoặc định dạng khoảng thời gian trong ngày của PostgreSQL (ví dụ3 days 04:05:06
:).
Sử dụng thư viện isodate để phân tích chuỗi thời lượng ISO 8601. Ví dụ:
isodate.parse_duration('PT1H5M26S')
Đồng thời xem Có cách nào dễ dàng để chuyển đổi thời lượng ISO 8601 sang hẹn giờ không?
d
ngày,h
giờ,m
phút vàs
giây sử dụng một dòng (sau khi nhậpdatetime
):datetime.timedelta(days = d, hours = h, minutes=m, seconds=s)
.