2009-02-10 46 views
14

Tôi có một tệp văn bản có nhiều chuỗi ngày giờ trong isoformat. Các chuỗi là tương tự như sau:Phân tích các chuỗi ngày tháng bằng micro giây

'2009/02/10 16: 06: 52,598800'

Các chuỗi được tạo ra sử dụng str(datetime_object). Vấn đề là, đối với một số lý do, str(datetime_object) tạo ra một định dạng khác nhau khi đối tượng datetime đã micro thiết lập để không và một số chuỗi giống như thế này:

'2009/02/10 16:06:52'

Làm cách nào tôi có thể phân tích các chuỗi này và chuyển đổi chúng thành một datetime object?

Điều rất quan trọng là lấy tất cả dữ liệu trong đối tượng, bao gồm micro giây.

Tôi phải sử dụng Python 2.5, tôi đã tìm thấy định dạng chỉ thị %f cho micro giây không tồn tại trong 2.5.

Trả lời

21

Hoặc:

from datetime import datetime 

def str2datetime(s): 
    parts = s.split('.') 
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S") 
    return dt.replace(microsecond=int(parts[1])) 

Sử dụng strptime bản thân để phân tích ngày/lần chuỗi (vì vậy không cần để suy nghĩ về các trường hợp góc cho một regex).

+0

Cảm ơn cho câu trả lời này! Tôi đề nghị thay đổi dòng cuối cùng thành: trả về dt.replace (micro giây = int (1000 * float ('0.' + phần [1]))) điều này xử lý tất cả các trường hợp một cách chính xác, ví dụ: '2017-03-16 21: 20: 57.31' nên cung cấp 310us thay vì 31us. – denizb

5

Ai đó đã gửi lỗi với sự cố này: Issue 1982. Vì bạn cần điều này để làm việc với python 2.5, bạn phải phân tích cú pháp giá trị manualy và sau đó thao tác đối tượng datetime.

2

Nó có thể không phải là giải pháp tốt nhất, nhưng bạn có thể sử dụng một biểu thức chính quy:

m = re.match(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d{6}))?', datestr) 
dt = datetime.datetime(*[int(x) for x in m.groups() if x]) 
10

Sử dụng mô-đun dateutil. Nó hỗ trợ một phạm vi rộng hơn nhiều các định dạng ngày tháng và thời gian hơn so với những cái được xây dựng trong Python.

Bạn sẽ cần phải easy_install dateutil cho đoạn mã sau để làm việc:

from dateutil.parser import parser 

p = parser() 
datetime_with_microseconds = p.parse('2009-02-10 16:06:52.598800') 
print datetime_with_microseconds.microsecond 

kết quả trong:

598799 
+0

+1 dateutil tất cả các cách – Yarin

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