2009-03-30 36 views
147

tôi có thể phân tích các chuỗi chứa ngày/giờ với time.strptimeLàm cách nào để phân tích chuỗi thời gian chứa mili giây bằng python?

>>> import time 
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S') 
(2009, 3, 30, 16, 31, 32, 0, 89, -1) 

Làm thế nào tôi có thể phân tích một chuỗi thời gian có chứa mili giây?

>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.5/_strptime.py", line 333, in strptime 
    data_string[found.end():]) 
ValueError: unconverted data remains: .123 

Trả lời

218

Python 2.6 bổ sung thêm một strftime mới/strptime vĩ mô %f, mà không micro giây. Không chắc chắn nếu điều này là tài liệu bất cứ nơi nào. Nhưng nếu bạn đang sử dụng 2.6 hoặc 3.0, bạn có thể làm điều này:

time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f') 

Edit: Tôi chưa bao giờ thực sự làm việc với các mô-đun time, vì vậy tôi đã không nhận thấy điều này lúc đầu, nhưng nó xuất hiện time.struct_time rằng không thực sự lưu trữ mili giây/micro giây. Bạn có thể được tốt hơn bằng cách sử dụng datetime, như thế này:

>>> from datetime import datetime 
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f') 
>>> a.microsecond 
123000 
+3

Cảm ơn http://docs.python.org/library/datetime.html: Mới trong phiên bản 2.6: đối tượng thời gian và ngày giờ hỗ trợ mã định dạng% f mở rộng đến số micro giây trong đối tượng, không đệm trên còn lại đến sáu nơi. – ilkinulas

+5

Woa Tôi có thể nói các tài liệu Python cần cập nhật. [Tài liệu cho mô-đun thời gian] (http://docs.python.org/library/time.html#time.strftime) không nói gì về '% f'. – phunehehe

+1

hm, không đệm trên * trái * sẽ sai, phải không? –

1

Suy nghĩ đầu tiên của tôi là cố gắng đi qua nó '30/09/03 16: 31: (. Với thời gian thay vì một dấu hai chấm giữa giây và mili giây) 32,123' Nhưng điều đó không làm việc. Xem nhanh tài liệu cho biết số giây phân số bị bỏ qua trong mọi trường hợp ...

Ah, khác biệt phiên bản. Đây là reported as a bug và hiện tại ở 2.6+ bạn có thể sử dụng "% S.% f" để phân tích cú pháp.

+0

Điều đó không hiệu quả; time.strptime chỉ không làm mili giây. – DNS

+0

Vâng, tôi thấy rằng khi tôi thử nó, do đó chỉnh sửa. – MarkusQ

1

từ danh sách gửi thư python: parsing millisecond thread. Có một chức năng được đăng ở đó dường như đã hoàn thành công việc, mặc dù như đã đề cập trong các bình luận của tác giả nó là loại hack. Nó sử dụng các biểu thức thông thường để xử lý ngoại lệ được nâng lên, và sau đó thực hiện một số phép tính.

Bạn cũng có thể thử thực hiện các biểu thức chính quy và các phép tính ở phía trước, trước khi chuyển nó sang strptime.

+0

vâng, tôi biết chủ đề đó. Nhưng tôi đang tìm kiếm một cách đơn giản hơn. là có bất kỳ mô-đun trong lib pyrt standart mà làm cho thời gian phân tích cú pháp với mili giây? – ilkinulas

3

Để cung cấp cho mã mà nstehr's answer đề cập đến (từ its source):

def timeparse(t, format): 
    """Parse a time string that might contain fractions of a second. 

    Fractional seconds are supported using a fragile, miserable hack. 
    Given a time string like '02:03:04.234234' and a format string of 
    '%H:%M:%S', time.strptime() will raise a ValueError with this 
    message: 'unconverted data remains: .234234'. If %S is in the 
    format string and the ValueError matches as above, a datetime 
    object will be created from the part that matches and the 
    microseconds in the time string. 
    """ 
    try: 
     return datetime.datetime(*time.strptime(t, format)[0:6]).time() 
    except ValueError, msg: 
     if "%S" in format: 
      msg = str(msg) 
      mat = re.match(r"unconverted data remains:" 
          " \.([0-9]{1,6})$", msg) 
      if mat is not None: 
       # fractional seconds are present - this is the style 
       # used by datetime's isoformat() method 
       frac = "." + mat.group(1) 
       t = t[:-len(frac)] 
       t = datetime.datetime(*time.strptime(t, format)[0:6]) 
       microsecond = int(float(frac)*1e6) 
       return t.replace(microsecond=microsecond) 
      else: 
       mat = re.match(r"unconverted data remains:" 
           " \,([0-9]{3,3})$", msg) 
       if mat is not None: 
        # fractional seconds are present - this is the style 
        # used by the logging module 
        frac = "." + mat.group(1) 
        t = t[:-len(frac)] 
        t = datetime.datetime(*time.strptime(t, format)[0:6]) 
        microsecond = int(float(frac)*1e6) 
        return t.replace(microsecond=microsecond) 

     raise 
12

Tôi biết đây là một câu hỏi cũ nhưng tôi vẫn đang sử dụng Python 2.4.3 và tôi cần phải tìm ra một cách tốt hơn để chuyển đổi chuỗi dữ liệu để một ngày giờ.

Giải pháp nếu datetime không hỗ trợ% f và mà không cần một thử/trừ là:

(dt, mSecs) = row[5].strip().split(".") 
    dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6]) 
    mSeconds = datetime.timedelta(microseconds = int(mSecs)) 
    fullDateTime = dt + mSeconds 

này làm việc cho chuỗi đầu vào "2010/10/06 09: 42: 52,266000"

+1

'dt.replace (microsecond = int (mSecs)) ' – haridsv

+0

Điều này áp dụng cho Python 2.5 trở về trước. Python 2.6 hỗ trợ strptime '% f' – smci

0

Đối với python 2 tôi đã làm này

print (time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1]) 

nó in time "% H:% M:% S" (. trước và sau), tách time.time() để hai chuỗi con xxxxxxx.xx và kể từ .xx là mili giây của tôi, tôi thêm phần phụ thứ hai chuỗi của tôi "% H:% M:% S"

hy vọng rằng làm cho đầu ra cảm giác :) Ví dụ:

13:31:21.72 Blink 01


13:31:21.81 END OF BLINK 01


13: 31: 26,3 Blink 01


13: 31: 26.39 END OF BLINK 01


13: 31: 34,65 Bắt đầu từ ngõ 01


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