Python phân tích ngày mờ

Khi bạn có thể nhận được các chuỗi có cấu trúc nhưng không nhất thiết phải chuẩn hoặc các chuỗi dạng tự do khác nhau, thì dateutil là tốt, như một dự phòng hoặc nói chung. (nó cũng có logic dựa trên ngày khác nhau mà bạn có thể không muốn tự làm)

Bạn có thể muốn chức năng

Ví dụ

>>> dateutil.parser.parse('2015-06-26 23:00:41')
datetime.datetime(2015, 6, 26, 23, 0, 41)
 
>>> dateutil.parser.parse("Thu Sep 25 2003")
datetime.datetime(2003, 9, 25, 0, 0)

Nó dường như phù hợp với các mẫu đã biết, vì vậy sẽ hoạt động trên nhiều thứ thông thường/tiêu chuẩn

Vào những ngày không rõ ràng như 02-04-2012, bạn có thể phải hướng dẫn nó, xem e. g.

Apache sử dụng định dạng ngày-giờ-với-múi giờ như

29/Nov/2013:14:21:20 +0100

ngày sử dụng. trình phân tích cú pháp. phân tích cú pháp vớiuzzy=True sẽ xử lý

Bạn có thể thực hiện với hàng chục dòng thao tác chuỗi, có thể nhanh hơn một chút (xác minh) (TODO. thêm vào đó)

Có thể trích xuất một ngày ra khỏi văn bản bằng cách sử dụng chế độ "mờ", trong đó các thành phần của chuỗi không được nhận dạng là một phần của ngày bị bỏ qua

from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)

from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
4 bây giờ là một đối tượng
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
5 và bạn sẽ thấy
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
6 được in ra

Mô-đun trình phân tích cú pháp có thể phân tích các chuỗi ngày giờ ở nhiều định dạng hơn. Không thể có thư viện nào tốt hơn dateutil để phân tích ngày và giờ trong Python. Để tra cứu múi giờ, mô-đun tz cung cấp mọi thứ. Khi các mô-đun này được kết hợp, chúng giúp dễ dàng phân tích các chuỗi thành các đối tượng ngày giờ nhận biết múi giờ

Cài đặt.
dateutil có thể được cài đặt bằng pip hoặc easy_install, tức là sudo pip install dateutil==2. 0 hoặc sudo easy_install dateutil==2. 0. 2. 0 để tương thích với Python 3 là bắt buộc. Tài liệu đầy đủ có thể được tìm thấy tại http. //labix. org/python-dateutil.

Mã số. Ví dụ phân tích cú pháp




from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
7

from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
8
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
9
datetime.datetime(2016, 6, 16, 0, 0)
0
datetime.datetime(2016, 6, 16, 0, 0)
1

datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
datetime.datetime(2016, 6, 16, 0, 0)
1
datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
datetime.datetime(2016, 6, 16, 0, 0)
6
datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
29/Nov/2013:14:21:20 +0100
01
datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
29/Nov/2013:14:21:20 +0100
06
datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
71____32

đầu ra

29/Nov/2013:14:21:20 +0100
7

Tất cả những gì cần làm là nhập mô-đun trình phân tích cú pháp và gọi hàm parse() bằng chuỗi ngày giờ. Trình phân tích cú pháp có thể trả về một đối tượng thời gian hợp lý, nhưng nó không thể phân tích cú pháp chuỗi, nó sẽ gây ra ValueError.
Cách thức hoạt động.

  • Trình phân tích cú pháp thay vì tìm kiếm các mã thông báo dễ nhận biết, hãy đoán những mã thông báo đó đề cập đến cái gì. Nó không sử dụng các biểu thức thông thường
  • Thứ tự của các mã thông báo này quan trọng vì nó sử dụng định dạng ngày giống như Tháng/Ngày/Năm (thứ tự mặc định), trong khi các mã thông báo khác sử dụng định dạng Ngày/Tháng/Năm
  • Hàm parse() lấy một đối số từ khóa tùy chọn, ngày đầu tiên, mặc định là Sai để giải quyết vấn đề này
  • Nó có thể phân tích chính xác ngày ở định dạng sau nếu nó được đặt thành True




from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
73
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
74
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
75
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
76
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
77
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
78

đầu ra

datetime.datetime(2016, 6, 16, 0, 0)

Một vấn đề đặt hàng khác có thể xảy ra với năm có hai chữ số. nhưng '19-6-19′ là một định dạng ngày không rõ ràng. Vì dateutil mặc định ở định dạng Tháng-Ngày-Năm, '11-6-19′ được phân tích thành năm 2019. Nhưng nếu yearfirst = True được chuyển vào parse(), nó có thể được phân tích thành năm 2011




datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
81
datetime.datetime(2016, 6, 16, 0, 0)
2

datetime.datetime(2016, 6, 16, 0, 0)
3
datetime.datetime(2016, 6, 16, 0, 0)
0
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
85
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
86
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
76
from dateutil.parser import parse

dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
77
datetime.datetime(2016, 6, 16, 0, 0)
2

đầu ra

29/Nov/2013:14:21:20 +0100
0

trình phân tích cú pháp dateutil cũng có thể thực hiện phân tích cú pháp mờ và cho phép bỏ qua các ký tự không liên quan trong chuỗi ngày giờ. parse() sẽ tăng ValueError với giá trị mặc định là Sai, khi nó gặp các mã thông báo không xác định. Một đối tượng ngày giờ thường có thể được trả về, nếu mờ = True