2010-07-22 43 views
101

Tôi có một tệp CSV dumpfile từ bản sao lưu IPD Blackberry, được tạo bằng cách sử dụng IPDDump. Các/lần chuỗi ngày ở đây giống như thế này (nơi EST là một múi giờ Úc):Python strptime() và múi giờ?

Tue Jun 22 07:46:22 EST 2010 

tôi cần để có thể phân tích ngày này bằng Python. Lúc đầu, tôi đã cố gắng sử dụng chức năng strptime() từ datettime.

>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z') 

Tuy nhiên, đối với một số lý do, đối tượng datetime mà trở lại dường như không có bất kỳ tzinfo liên kết với nó.

Tôi đã đọc trên this page dường như datetime.strptime âm thầm loại tzinfo, tuy nhiên, tôi đã kiểm tra tài liệu và tôi không thể tìm thấy bất kỳ điều gì với hiệu ứng đó được ghi lại here.

Tôi đã có thể lấy ngày được phân tích cú pháp bằng thư viện Python của bên thứ ba, dateutil, tuy nhiên tôi vẫn tò mò về cách sử dụng strptime() không chính xác trong? Có cách nào để có được strptime() để chơi độc đáo với múi giờ không?

+1

Bạn không thể ... chuyển đổi tất cả các ngày thành GMT? – Robus

+1

@Robus: Hmm, tôi đã hy vọng làm điều đó - nhưng tôi đã giả định rằng strftime/datetime bằng cách nào đó có thể làm điều đó?Dù bằng cách nào, tôi cần phải lưu trữ/phân tích cú pháp thực tế rằng các lịch biểu trong múi giờ EST hoặc bất kỳ múi giờ nào xảy ra với tôi. Tập lệnh cần có khả năng phân tích cú pháp thời gian biểu chung với thông tin múi giờ (ví dụ: ETC có thể là bất kỳ múi giờ nào khác). – victorhooi

+3

EST cũng là từ viết tắt múi giờ của Hoa Kỳ. (Tương tự như vậy, BST là cả tiếng Anh và một dấu thời gian của Brazil.) Những từ viết tắt như vậy vốn chỉ mơ hồ. Thay vào đó, hãy sử dụng bù trừ tương đối so với UTC/GMT. (Nếu bạn cần hỗ trợ chữ viết tắt, bạn cần phải phụ thuộc vào ngôn ngữ lập bản đồ và đó là lỗ chuột lộn xộn.) –

Trả lời

26

Các datetime module documentation nói:

Return a datetime corresponding to date_string, parsed according to format. This is equivalent to datetime(*(time.strptime(date_string, format)[0:6])) .

Thấy rằng [0:6]? Điều đó giúp bạn được (year, month, day, hour, minute, second). Không có gì khác. Không đề cập đến múi giờ.

Thật thú vị, [Win XP SP2, Python 2.6, 2.7] chuyển ví dụ của bạn tới time.strptime không hoạt động nhưng nếu bạn loại bỏ "% Z" và "EST" thì nó hoạt động. Cũng sử dụng "UTC" hoặc "GMT" thay vì công việc "EST". "PST" và "MEZ" không hoạt động. Khó hiểu.

+2

Lỗi Python liên quan: [% Z trong strptime không khớp với EST và những người khác] (http://bugs.python.org/issue22377) – jfs

276

Tôi khuyên bạn nên sử dụng python-dateutil. Trình phân tích cú pháp của nó đã có thể phân tích cú pháp mọi định dạng ngày tôi đã ném vào nó cho đến nay.

>>> from dateutil import parser 
>>> parser.parse("Tue Jun 22 07:46:22 EST 2010") 
datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal()) 
>>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400") 
datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400)) 
>>> parser.parse("Sun") 
datetime.datetime(2011, 12, 18, 0, 0) 
>>> parser.parse("10-11-08") 
datetime.datetime(2008, 10, 11, 0, 0) 

v.v. Không giao dịch với strptime() định dạng vô nghĩa ... chỉ cần ném một ngày vào nó và nó có điều đúng.

Cập nhật: Rất tiếc. Tôi đã bỏ lỡ câu hỏi ban đầu của bạn rằng bạn đã đề cập rằng bạn đã sử dụng dateutil, xin lỗi về điều đó. Nhưng tôi hy vọng câu trả lời này vẫn hữu ích cho những người khác vấp phải câu hỏi này khi họ có câu hỏi phân tích ngày và xem tiện ích của mô-đun đó.

+5

Một triệu và một upvotes cho lớp đáng kinh ngạc này. Cảm ơn bạn đã chia sẻ. –

+1

+1 câu trả lời này đã chứng minh thực sự hữu ích! Cảm ơn :-) – nemesisdesign

+0

Vì rất nhiều người có xu hướng sử dụng python-dateutil, tôi muốn chỉ cho chúng tôi một giới hạn của lib đó. '>>> parser.parse (" Thu, 25 Sep 2003 10: 49: 41,123 -0300 ") Traceback (cuộc gọi gần đây nhất): Tệp" ", dòng 1, trong Tệp"/Người dùng/wanghq /awscli/lib/python2.7/site-packages/dateutil/parser.py ", dòng 748, trong phân tích cú pháp trả về DEFAULTPARSER.parse (timestr, ** kwargs) Tệp"/Users/wanghq/awscli/lib/python2 .7/site-packages/dateutil/parser.py ", dòng 310, trong phân tích cú pháp res, skipped_tokens = self._parse (timestr, ** kwargs) LoạiError: đối tượng 'NoneType' không thể lặp lại ' – wanghq

6

Chuỗi thời gian của bạn tương tự với định dạng thời gian trong rfc 2822 (date format in email, http headers). Bạn có thể phân tích nó chỉ sử dụng stdlib:

>>> from email.utils import parsedate_tz 
>>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010') 
(2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000) 

Xem các giải pháp mang lại đối tượng datetime timezone-aware cho các phiên bản Python khác nhau: parsing date with timezone from an email.

Ở định dạng này, EST is semantically equivalent to -0500. Mặc dù, nói chung, a timezone abbreviation is not enough, to identify a timezone uniquely.

Các vấn đề liên quan