Sử dụng% f với strftime () trong Python để nhận micro giây


112

Tôi đang cố gắng sử dụng hàm strftime () đến độ chính xác micro giây, điều này có vẻ khả thi bằng cách sử dụng% f (như đã nêu ở đây ). Tuy nhiên, khi tôi thử mã sau:

import time
import strftime from time

print strftime("%H:%M:%S.%f")

... Tôi nhận được giờ, phút và giây, nhưng% f in dưới dạng% f, không có dấu của micro giây. Tôi đang chạy Python 2.6.5 trên Ubuntu, vì vậy nó sẽ ổn và% f nên được hỗ trợ (nó được hỗ trợ cho 2.6 trở lên, theo như tôi biết.)

Câu trả lời:


181

Bạn có thể sử dụng hàm strftime của datetime để có được điều này. Vấn đề là strftime của thời gian chấp nhận một khoảng thời gian không mang thông tin micro giây.

from datetime import datetime
datetime.now().strftime("%H:%M:%S.%f")

Nên làm các thủ thuật!


1
Không nếu bạn muốn sử dụng%z
vallentin 12/02/17

@Vallentin chắc chắn là ngược lại! datetime hỗ trợ %zchỉ thị trong khi thời gian dường như không .
adamnfish 13/02/17

Cả hai đều hỗ trợ %ztrong Python 3 :-) đây là ngày giờ và sau đó là thời gian
adamnfish

Ồ, bạn nói đúng. Tôi đã bỏ lỡ nó vào ngày giờ vì nó không ở dưới cùng, giống như trên bàn cho thời gian. : P
vallentin 13/02/17

6
lưu ý from datetime import datetime. Nếu bạn chỉ làm import datetimebạn sẽ phải sử dụngdatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

Bạn đang xem sai tài liệu. Các timemô-đun có tài liệu khác nhau .

Bạn có thể sử dụng datetimemô-đun strftimenhư thế này:

>>> from datetime import datetime
>>>
>>> now = datetime.now()
>>> now.strftime("%H:%M:%S.%f")
'12:19:40.948000'

1
Đây là liên kết đến tài liệu của mô-đun datetime: docs.python.org/2/library/…
Mr Fooz

Cảm ơn vì bài đăng. Tại sao có mô-đun ngày giờ và thời gian?
tommy.carstensen


9

Với timemô-đun của Python, bạn không thể nhận được micro giây %f.

Đối với những người vẫn muốn timechỉ sử dụng mô-đun, đây là một cách giải quyết:

now = time.time()
mlsec = repr(now).split('.')[1][:3]
print time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec), time.localtime(now))

Bạn sẽ nhận được một cái gì đó như 2017-01-16 16: 42: 34.625 EET (vâng, tôi sử dụng mili giây vì nó khá đủ).

Để chia mã thành chi tiết, hãy dán mã dưới đây vào bảng điều khiển Python:

import time

# Get current timestamp
now = time.time()

# Debug now
now
print now
type(now)

# Debug strf time
struct_now = time.localtime(now)
print struct_now
type(struct_now)

# Print nicely formatted date
print time.strftime("%Y-%m-%d %H:%M:%S %Z", struct_now)

# Get miliseconds
mlsec = repr(now).split('.')[1][:3]
print mlsec

# Get your required timestamp string
timestamp = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec), struct_now)
print timestamp

Để làm rõ, tôi cũng dán kết quả Python 2.7.12 của mình vào đây:

>>> import time
>>> # get current timestamp
... now = time.time()
>>> # debug now
... now
1484578293.519106
>>> print now
1484578293.52
>>> type(now)
<type 'float'>
>>> # debug strf time
... struct_now = time.localtime(now)
>>> print struct_now
time.struct_time(tm_year=2017, tm_mon=1, tm_mday=16, tm_hour=16, tm_min=51, tm_sec=33, tm_wday=0, tm_yday=16, tm_isdst=0)
>>> type(struct_now)
<type 'time.struct_time'>
>>> # print nicely formatted date
... print time.strftime("%Y-%m-%d %H:%M:%S %Z", struct_now)
2017-01-16 16:51:33 EET
>>> # get miliseconds
... mlsec = repr(now).split('.')[1][:3]
>>> print mlsec
519
>>> # get your required timestamp string
... timestamp = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec), struct_now)
>>> print timestamp
2017-01-16 16:51:33.519 EET
>>>

6

Điều này sẽ làm công việc

import datetime
datetime.datetime.now().strftime("%H:%M:%S.%f")

Nó sẽ in

HH:MM:SS.microseconds như thế này vd 14:38:19.425961


5

Bạn cũng có thể nhận được độ chính xác micro giây từ timemô-đun bằng time()chức năng của nó .
( time.time()trả về thời gian tính bằng giây kể từ kỷ nguyên. Phần phân số của nó là thời gian tính bằng micrô giây, là những gì bạn muốn.)

>>> from time import time
>>> time()
... 1310554308.287459   # the fractional part is what you want.


# comparision with strftime -
>>> from datetime import datetime
>>> from time import time
>>> datetime.now().strftime("%f"), time()
... ('287389', 1310554310.287459)

1
Thông minh. Cảm ơn tất cả sự giúp đỡ của bạn. Tôi đã cố gắng để mọi thứ hoạt động, mặc dù đã tìm thấy một lỗi kỳ lạ có nghĩa là micro giây không xuất hiện khi chạy tập lệnh dưới dạng sudo trên một cset cụ thể, nhưng sẽ xảy ra nếu tôi đăng nhập bằng sudo trước khi cố gắng chạy nó trên một cset cụ thể. Kỳ quặc.
user820924

4

Khi "% f" cho micro giây không hoạt động, vui lòng sử dụng phương pháp sau:

import datetime

def getTimeStamp():
    dt = datetime.datetime.now()
    return dt.strftime("%Y%j%H%M%S") + str(dt.microsecond)

3
Điều này sẽ không hoạt động nếu dt.microsecond có ít hơn 6 chữ số.
M456,

3
Đây là giải pháp duy nhất thực sự hiệu quả với tôi. Trong Jython trên Windows% f dường như luôn in ra chữ% f. Tôi muốn mili giây để str đã qua sử dụng (dt.microsecond) [0: 3]
Ed Randall

1
str (dt.microsecond) [0: 3] có thể tạo ra kết quả sai (ví dụ: 300 micro giây là 0,300 milesec giây, nhưng nó sẽ in ra 300!)
cabbi

3
"% 03d"% int (dt.microsecond / 1000) -> điều này sẽ in millseconds chứ không phải micro giây
cabbi

0

Nếu bạn muốn tốc độ, hãy thử điều này:

def _timestamp(prec=0):
    t = time.time()
    s = time.strftime("%H:%M:%S", time.localtime(t))
    if prec > 0:
        s += ("%.9f" % (t % 1,))[1:2+prec]
    return s

Ở đâu preclà chính xác - có bao nhiêu chữ số thập phân mà bạn muốn. Xin lưu ý rằng hàm không có vấn đề với các số không ở đầu trong phần phân số như một số giải pháp khác được trình bày ở đây.


-1

Nếu bạn muốn một số nguyên, hãy thử mã này:

import datetime
print(datetime.datetime.now().strftime("%s%f")[:13])

Đầu ra:

1545474382803
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.