Hướng dẫn python timedelta from string - python thời gian từ chuỗi

Tôi đang viết một chức năng cần phân tích chuỗi thành

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
5. Người dùng phải nhập một cái gì đó như
print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
6 hoặc
print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
7, hoặc thậm chí
print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
8 hoặc ________ 19 ... Có thư viện hoặc một cái gì đó có loại này đã được thực hiện không?

Hướng dẫn python timedelta from string - python thời gian từ chuỗi

Tế bào thần kinh

4.6924 Huy hiệu vàng33 Huy hiệu bạc54 Huy hiệu đồng4 gold badges33 silver badges54 bronze badges

Đã hỏi ngày 7 tháng 1 năm 2011 lúc 17:03Jan 7, 2011 at 17:03

1

Đối với tôi, giải pháp thanh lịch nhất, mà không phải dùng đến các thư viện bên ngoài như DateUtil hoặc phân tích thủ công đầu vào, là sử dụng phương pháp phân tích cú pháp chuỗi ____20 mạnh mẽ của DateTime.

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 TimeDelta 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 điều chính xác, v.v.

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())

Đã trả lời ngày 10 tháng 9 năm 2012 lúc 13:20Sep 10, 2012 at 13:20

metakermitmetakermitmetakermit

20K12 Huy hiệu vàng85 Huy hiệu bạc95 Huy hiệu Đồng12 gold badges85 silver badges95 bronze badges

8

Tôi đã có một chút thời gian trên tay 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, bao gồm tất cả các định dạng được yêu cầu bởi @priestc.

Mã nguồn nằm trên GitHub (giấy phép MIT) cho bất kỳ ai muốn nó. Nó cũng trên Pypi:

pip install pytimeparse

Trả về thời gian như 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

Đã trả lời ngày 1 tháng 2 năm 2014 lúc 12:26Feb 1, 2014 at 12:26

Wildwilhelmwildwilhelmwildwilhelm

4.6291 Huy hiệu vàng18 Huy hiệu bạc24 Huy hiệu đồng1 gold badge18 silver badges24 bronze badges

2

Đối với định dạng đầu tiên (

pip install pytimeparse
1), bạn nên phân tích cú pháp bằng cách sử dụng các biểu thức thông thường

Đây là giải pháp dựa trên RE:

import re
from datetime import timedelta


regex = re.compile(r'((?P\d+?)hr)?((?P\d+?)m)?((?P\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.items():
        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)
>>> 

Hướng dẫn python timedelta from string - python thời gian từ chuỗi

bryant1410

5.0224 Huy hiệu vàng38 Huy hiệu bạc37 Huy hiệu đồng4 gold badges38 silver badges37 bronze badges

Đã trả lời ngày 7 tháng 1 năm 2011 lúc 17:06Jan 7, 2011 at 17:06

Virhilovirhilovirhilo

6.3262 Huy hiệu vàng29 Huy hiệu bạc26 Huy hiệu đồng2 gold badges29 silver badges26 bronze badges

4

Tôi đã sửa đổi câu trả lời hay của Virhilo với một vài nâng cấp:

  • Đã thêm một khẳng định rằng chuỗi là chuỗi thời gian hợp lệ
  • Thay thế "HR" Chỉ số giờ bằng "H"
  • Cho phép chỉ báo "D" - ngày
  • Cho phép thời gian không định cư (ví dụ:
    pip install pytimeparse
    
    2 là 3 phút, 0,25 giây)

.

import re
from datetime import timedelta


regex = re.compile(r'^((?P[\.\d]+?)d)?((?P[\.\d]+?)h)?((?P[\.\d]+?)m)?((?P[\.\d]+?)s)?$')


def parse_time(time_str):
    """
    Parse a time string e.g. (2h23m) 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. 2h23m)
    :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)

Đã trả lời ngày 19 tháng 8 năm 2018 lúc 10:55Aug 19, 2018 at 10:55

Hướng dẫn python timedelta from string - python thời gian từ chuỗi

PeterpeterPeter

11.2k9 Huy hiệu vàng67 Huy hiệu bạc77 Huy hiệu đồng9 gold badges67 silver badges77 bronze badges

6

Tôi muốn nhập chỉ một thời gian và sau đó thêm nó vào các ngày khác nhau để điều này làm việc cho tôi:

from datetime import datetime as dtt

time_only = dtt.strptime('15:30', "%H:%M") - dtt.strptime("00:00", "%H:%M")

Đã trả lời ngày 1 tháng 3 năm 2017 lúc 22:27Mar 1, 2017 at 22:27

KZTDKZTDkztd

2.78119 Huy hiệu bạc17 Huy hiệu đồng19 silver badges17 bronze badges

2

Nếu gấu trúc đã ở trong các phụ thuộc của bạn, thì điều này khá tốt:

>>> import pandas as pd
>>> pd.Timedelta('5hr34m56s')
Timedelta('0 days 05:34:56')

>>> pd.Timedelta('2h32m')
Timedelta('0 days 02:32:00')

>>> pd.Timedelta('5hr34m56s')
Timedelta('0 days 05:34:56')

>>> # It is pretty forgiving:
>>> pd.Timedelta('2 days 24:30:00 10 sec')
Timedelta('3 days 00:30:10')

Để chuyển đổi thành

pip install pytimeparse
3 nếu bạn thích loại đó:

>>> pd.Timedelta('1 days').to_pytimedelta()
datetime.timedelta(1)

Thật không may, điều này không hoạt động mặc dù:

>>> pd.Timedelta('4:13')
Traceback (most recent call last):
  File "", line 1, in 
  File "pandas\_libs\tslibs\timedeltas.pyx", line 1217, in 
pandas._libs.tslibs.timedeltas.Timedelta.__new__
  File "pandas\_libs\tslibs\timedeltas.pyx", line 454, in 
pandas._libs.tslibs.timedeltas.parse_timedelta_string
ValueError: expected hh:mm:ss format

Pandas thực sự có các công cụ ngày và thời gian khá rộng rãi mặc dù đó không phải là mục đích chính của nó.

Để cài đặt gấu trúc:

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
0

Đã trả lời ngày 6 tháng 8 năm 2021 lúc 19:24Aug 6, 2021 at 19:24

Hướng dẫn python timedelta from string - python thời gian từ chuỗi

Miksusmiksusmiksus

1.2461 Huy hiệu vàng9 Huy hiệu bạc21 Huy hiệu đồng1 gold badge9 silver badges21 bronze badges

Nếu bạn muốn sử dụng: làm dấu tách, tôi sử dụng chức năng này:

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
1

Examples:

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
2

Đã trả lời ngày 26 tháng 3 năm 2021 lúc 0:40Mar 26, 2021 at 0:40

Hướng dẫn python timedelta from string - python thời gian từ chuỗi

n4321dn4321dn4321d

1.3531 Huy hiệu vàng9 Huy hiệu bạc24 Huy hiệu đồng1 gold badge9 silver badges24 bronze badges

2

Django đi kèm với chức năng tiện ích

pip install pytimeparse
4. Từ tài liệu:

Phân tích một chuỗi và trả về một

pip install pytimeparse
3.

Mong đợi dữ liệu ở định dạng

pip install pytimeparse
6 hoặc theo quy định của ISO 8601 (ví dụ:
pip install pytimeparse
7 tương đương với
pip install pytimeparse
8) hoặc định dạng khoảng thời gian ban ngày của PostgreSQL (ví dụ:
pip install pytimeparse
9).

Đã trả lời ngày 3 tháng 1 năm 2019 lúc 0:28Jan 3, 2019 at 0:28

Don Kirkbydon KirkbyDon Kirkby

50K25 Huy hiệu vàng197 Huy hiệu bạc278 Huy hiệu đồng25 gold badges197 silver badges278 bronze badges

1

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:

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
3

Đã trả lời ngày 1 tháng 9 năm 2016 lúc 10:57Sep 1, 2016 at 10:57

Cân nhắc thử Tempora.Parse_Timedelta.

print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
4

Đã trả lời ngày 20 tháng 6 năm 2021 lúc 22:58Jun 20, 2021 at 22:58

Jason R. Coombsjason R. CoombsJason R. Coombs

39,9k10 Huy hiệu vàng80 Huy hiệu bạc88 Huy hiệu đồng10 gold badges80 silver badges88 bronze badges