2009-08-11 40 views
16

Tôi muốn phân tích ngày như thế này vào một đối tượng datetime:python datetime strptime wildcard

  • 12 Tháng 12 năm 2008
  • 01 Tháng một 2009

Sau đây sẽ làm việc cho ngày đầu tiên :

datetime.strptime("December 12th, 2008", "%B %dth, %Y") 

nhưng sẽ không thành công thứ hai vì hậu tố đến số ngày ('st') . Vì vậy, có một ký tự đại diện không có giấy tờ trong strptime? Hoặc một cách tiếp cận tốt hơn hoàn toàn?

Trả lời

18

Hãy thử sử dụng mô-đun dateutil.parser.

import dateutil.parser 
date1 = dateutil.parser.parse("December 12th, 2008") 
date2 = dateutil.parser.parse("January 1st, 2009") 

Tài liệu bổ sung có thể được tìm thấy ở đây: http://labix.org/python-dateutil

+0

python-dateutil dường như đã di chuyển. Các tài liệu có tại https://dateutil.readthedocs.org/en/latest/ và có các liên kết đến trang github repo và pypi ở đó. – drevicko

7

strptime là khó khăn bởi vì nó dựa trên các thư viện C cơ bản để thực hiện nó, vì vậy một số chi tiết khác nhau giữa các nền tảng. Có vẻ như không phải là một cách để phù hợp với các nhân vật bạn cần. Nhưng bạn có thể làm sạch các dữ liệu đầu tiên:

# Remove ordinal suffixes from numbers. 
date_in = re.sub(r"(st|nd|rd|th),", ",", date_in) 
# Parse the pure date. 
date = datetime.strptime(date_in, "%B %d, %Y") 
+6

Tôi sẽ lo lắng về điều này sẽ xảy ra cho tháng Tám. –

+1

Đó là lý do tại sao tôi bao gồm dấu phẩy sau. –

+1

Tôi muốn nói rằng bạn nên thêm [\ d] {1,2} trước biểu thức chính quy của mình. Sau khi tất cả các bạn muốn kết hợp hậu tố sau số, phải không? :-) – Vince

9

Bạn cần Gustavo Niemeyer của python_dateutil - khi nó đã được cài đặt,

>>> from dateutil import parser 
>>> parser.parse('December 12th, 2008') 
datetime.datetime(2008, 12, 12, 0, 0) 
>>> parser.parse('January 1st, 2009') 
datetime.datetime(2009, 1, 1, 0, 0) 
>>> 
1

Đối với bất cứ ai, như tôi, chỉ muốn một cái gì đó "công trình" mà không thêm module, đây là một giải pháp nhanh chóng và bẩn.

string_list = ["th", "rd", "nd", "st"] 
time = None 
for str in string_list: 
    if (time is not None): 
     break 
    try: 
     match_string = '%B %d' + str +', %Y' 
     time = datetime.strptime("December 12th, 2008", match_string) 
    except Exception: 
     pass 
Các vấn đề liên quan