Menggunakan% f dengan strftime () dengan Python untuk mendapatkan mikrodetik


112

Saya mencoba menggunakan strftime () ke presisi mikrodetik, yang tampaknya mungkin menggunakan% f (seperti yang dinyatakan di sini ). Namun ketika saya mencoba kode berikut:

import time
import strftime from time

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

... Saya mendapatkan jam, menit dan detik, tapi% f mencetak sebagai% f, tanpa tanda mikrodetik. Saya menjalankan Python 2.6.5 di Ubuntu, jadi seharusnya baik-baik saja dan% f harus didukung (ini didukung untuk 2.6 dan di atasnya, sejauh yang saya tahu.)

Jawaban:


181

Anda dapat menggunakan fungsi strftime datetime untuk mendapatkan ini. Masalahnya adalah bahwa strftime waktu menerima sebuah scheduleuple yang tidak membawa informasi mikrodetik.

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

Harus melakukan triknya!


1
Tidak jika Anda ingin menggunakan%z
vallentin

@Vallentin cukup yakin itu sebaliknya! datetime mendukung %zarahan sementara waktu tampaknya tidak .
adamnfish

Keduanya mendukung %zPython 3 :-) di sini adalah waktu dan waktu
adamnfish

Ohh kamu benar. Saya melewatkannya pada tanggal waktu karena tidak ada di bagian bawah, seperti di meja untuk waktu. : P
vallentin

6
perhatikan from datetime import datetime. Jika Anda hanya melakukannya, import datetimeAnda harus menggunakandatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

Anda melihat dokumentasi yang salah. The timemodul memiliki dokumentasi yang berbeda .

Anda dapat menggunakan datetimemodul strftimeseperti ini:

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

1
Berikut tautan ke dokumentasi modul datetime: docs.python.org/2/library/…
Tuan

Terima kasih atas kirimannya. Mengapa ada modul waktu dan waktu?
tommy.carstensen


9

Dengan timemodul Python, Anda tidak bisa mendapatkan mikrodetik %f.

Bagi mereka yang masih ingin menggunakan timemodul saja, berikut ini solusinya:

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

Anda harus mendapatkan sesuatu seperti 2017-01-16 16: 42: 34.625 EET (ya, saya menggunakan milidetik karena itu cukup).

Untuk memecah kode menjadi detail, tempel kode di bawah ini ke konsol 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

Untuk tujuan klarifikasi, saya juga menempelkan hasil Python 2.7.12 saya di sini:

>>> 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

Ini harus bekerja

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

Ini akan dicetak

HH:MM:SS.microseconds seperti ini misalnya 14:38:19.425961


5

Anda juga bisa mendapatkan presisi mikrodetik dari timemodul menggunakan time()fungsinya.
( time.time()mengembalikan waktu dalam detik sejak periode. Bagian pecahannya adalah waktu dalam mikrodetik, yang Anda inginkan.)

>>> 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
Luar biasa. Terima kasih atas seluruh bantuan Anda. Saya telah berhasil membuat semuanya berfungsi, meskipun menemukan bug aneh yang berarti mikrodetik tidak muncul saat menjalankan skrip sebagai sudo pada set tertentu, tetapi lakukan jika saya masuk sebagai sudo sebelum mencoba menjalankannya pada set tertentu. Aneh.
pengguna820924

4

Jika "% f" untuk detik mikro tidak bekerja, gunakan metode berikut:

import datetime

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

3
Ini tidak akan berfungsi jika dt.microsecond memiliki kurang dari 6 digit.
M456

3
Ini adalah satu-satunya solusi yang benar-benar berhasil untuk saya. Dalam Jython pada Windows% f sepertinya selalu mencetak% f literal. Saya ingin milidetik jadi menggunakan str (dt.microsecond) [0: 3]
Ed Randall

1
str (dt.microsecond) [0: 3] mungkin menghasilkan hasil yang salah (misalnya 300 mikrodetik adalah 0,300 milidetik, tetapi akan mencetak 300!)
cabbi

3
"% 03d"% int (dt.microsecond / 1000) -> ini mencetak milleconds dan bukan
microdeconds

0

Jika Anda ingin kecepatan, coba ini:

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

Di mana precpresisi - berapa banyak tempat desimal yang Anda inginkan. Harap dicatat bahwa fungsi tersebut tidak memiliki masalah dengan nol di depan di bagian pecahan seperti beberapa solusi lain yang disajikan di sini.


-1

Jika Anda menginginkan integer, coba kode ini:

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

Keluaran:

1545474382803
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.