2012-04-26 30 views
5

Tôi có một số phạm vi ngày con người phong cách, trong chuỗi, như sau:Parse phạm vi ngày con người-format bằng Python

22-24th April 2012 
14-23 July 
20th June - 5th July 

Tôi muốn phân tích những bằng Python để tôi có thể kết thúc với hai datetime đối tượng: một cho sự bắt đầu, một cho kết thúc.

Có mô-đun nào cho phép tôi thực hiện việc này không? Tôi đã thử parsedatetime, và nó trông giống như chức năng evalRange trong đó có thể làm điều đó (xem http://code-bear.com/code/parsedatetime/docs/index.html cho tài liệu), nhưng nó không có vẻ để phân tích bất cứ điều gì cả, và chỉ trả về ngày/giờ hiện tại, hai lần.

Bất kỳ ý tưởng nào?

+1

robin, IMHO - với sự đa dạng của những của regex dây và logic tùy chỉnh là đặt cược tốt nhất của bạn. -dc – dc5553

Trả lời

7

tôi đã kết thúc viết một mô-đun Python để làm điều này, mà tôi có bây giờ mở nguồn. Nó có sẵn để tải về trên Github, có documentation, và nó có thể được cài đặt từ PyPI sử dụng:

pip install daterangeparser 

Đối với những người quan tâm, các mô-đun công trình bằng cách tạo ra một phân tích cú pháp đầy đủ bằng PyParsing, một tuyệt vời (và đáng chú ý dễ sử dụng).

+1

Tuyệt vời! Cảm ơn! –

2

Bạn có thể sử dụng dateutil.parser. Nhưng nó không xử lý phạm vi ngày. Bạn có thể cần phải áp dụng một biểu thức chính quy trước đây.

import dateutil.parser 
dateutil.parser.parse("20th June") 

lợi nhuận datetime.datetime(2012, 6, 20, 0, 0)

Trân

0

Dựa trên câu trả lời trước, những gì bạn có thể làm là:

  1. preprocess đầu vào của bạn để bạn có được sự khởi đầu và ngày kết thúc (ví dụ: 20th June5th July). Trong ví dụ đầu tiên của bạn (date_range == 22-24th July 2012), bạn có thể làm điều đó bằng cách sử dụng date_range.split(' ')[0].split('-'): điều này sẽ trở ['22', '24th'] (chỉ việc kéo thả th và tương tự)
  2. Nhận datetime đối tượng từ những ngày này sử dụng dateutil.parser: dateutil.parser.parse('22 July 2012')

Dưới đây là một thực hiện những gì trước đây cho biết:

import dateutil.parser 
date_range = '20-22th July 2013' 
date_range = date_range.lower() 
for suffix in {'th', 'rd', 'st'}: 
    date_range.replace(suffix, '') 
days = date_range.split(' ')[0].split('-') 
month_year = date_range.split(' ')[1] 
begin, end = days[0] + ' ' + month_year, days[1] + ' ' + month_year 
begin_date = dateutil.parser.parse(begin) 
end_date = dateutil.parser.parse(end) 
Các vấn đề liên quan