ใช้% f กับ strftime () ใน Python เพื่อรับไมโครวินาที


112

ฉันกำลังพยายามใช้ strftime () เพื่อความแม่นยำระดับไมโครวินาทีซึ่งดูเหมือนจะเป็นไปได้โดยใช้% f (ตามที่ระบุไว้ที่นี่ ) อย่างไรก็ตามเมื่อฉันลองใช้รหัสต่อไปนี้:

import time
import strftime from time

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

... ฉันได้ชั่วโมงนาทีและวินาที แต่% f พิมพ์เป็น% f โดยไม่มีสัญญาณของไมโครวินาที ฉันใช้ Python 2.6.5 บน Ubuntu ดังนั้นมันควรจะใช้ได้และควรรองรับ% f (รองรับ 2.6 ขึ้นไปเท่าที่ฉันรู้)

คำตอบ:


182

คุณสามารถใช้ฟังก์ชัน strftime ของ datetime เพื่อรับสิ่งนี้ ปัญหาคือช่วงเวลาเร่งด่วนของเวลายอมรับตารางเวลาที่ไม่มีข้อมูลระดับไมโครวินาที

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

ควรทำเคล็ดลับ!


1
ไม่ใช่ถ้าคุณต้องการใช้%z
vallentin

@ วัลเลนตินค่อนข้างมั่นใจว่าตรงกันข้าม! datetime สนับสนุน%zคำสั่งในขณะที่ไม่ปรากฏเวลา
adamnfish

ทั้งสองรองรับ%zใน Python 3 :-) นี่คือวันเวลา
adamnfish

โอ้คุณพูดถูก ฉันพลาดมันในวันที่และเวลาเนื่องจากมันไม่ได้อยู่ที่ด้านล่างเหมือนตารางเวลา : P
vallentin

6
สังเกตfrom datetime import datetime. ถ้าคุณimport datetimeจะต้องใช้datetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

คุณกำลังดูเอกสารที่ไม่ถูกต้อง timeโมดูลมีเอกสารที่แตกต่างกัน

คุณสามารถใช้datetimeโมดูลstrftimeดังนี้:

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

1
นี่คือลิงค์ไปยังเอกสารของโมดูลวันที่และเวลา: docs.python.org/2/library/…
Mr Fooz

ขอบคุณสำหรับโพสต์ เหตุใดจึงมีโมดูลวันที่และเวลา
tommy.carstensen


9

ด้วยtimeโมดูลของ Python คุณจะไม่สามารถรับไมโครวินาที%fได้

สำหรับผู้ที่ยังต้องการใช้timeโมดูลเท่านั้นนี่คือวิธีแก้ปัญหา:

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

คุณควรจะได้รับบางอย่างเช่น2017-01-16 16: 42: 34.625 EET (ใช่ฉันใช้มิลลิวินาทีเพราะมันค่อนข้างเพียงพอ)

หากต้องการแบ่งรหัสเป็นรายละเอียดให้วางรหัสด้านล่างลงในคอนโซล 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

เพื่อวัตถุประสงค์ในการชี้แจงฉันยังวางผลลัพธ์ Python 2.7.12 ที่นี่:

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

สิ่งนี้ควรทำ

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

มันจะพิมพ์

HH:MM:SS.microseconds เช่นนี้เช่น 14:38:19.425961


5

คุณยังสามารถรับความแม่นยำระดับไมโครวินาทีจากtimeโมดูลโดยใช้time()ฟังก์ชัน
( time.time()คืนเวลาเป็นวินาทีตั้งแต่ยุคส่วนเศษส่วนคือเวลาในหน่วยไมโครวินาทีซึ่งเป็นสิ่งที่คุณต้องการ)

>>> 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
ยอดเยี่ยม. ขอบคุณสำหรับความช่วยเหลือของคุณ ฉันจัดการเพื่อให้สิ่งต่างๆทำงานได้แม้ว่าจะพบข้อผิดพลาดแปลก ๆ ซึ่งหมายความว่า microseconds จะไม่ปรากฏเมื่อเรียกใช้สคริปต์เป็น sudo บน cset เฉพาะ แต่ถ้าฉันเข้าสู่ระบบด้วย sudo ก่อนที่จะพยายามเรียกใช้บน cset เฉพาะ แปลก
user820924

4

เมื่อ "% f" สำหรับไมโครวินาทีไม่ทำงานโปรดใช้วิธีการต่อไปนี้:

import datetime

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

3
สิ่งนี้จะใช้ไม่ได้ถ้า dt.microsecond มีน้อยกว่า 6 หลัก
M456

3
นี่เป็นทางออกเดียวที่ใช้ได้ผลจริงสำหรับฉัน ใน Jython บน Windows% f ดูเหมือนว่าจะพิมพ์% f ตามตัวอักษรเสมอ ฉันต้องการมิลลิวินาทีจึงใช้ str (dt.microsecond) [0: 3]
Ed Randall

1
str (dt.microsecond) [0: 3] อาจให้ผลลัพธ์ที่ไม่ถูกต้อง (เช่น 300 microseconds คือ 0.300 milleseconds แต่จะพิมพ์ 300!)
cabbi

3
"% 03d"% int (dt.microsecond / 1000) -> สิ่งนี้จะพิมพ์หน่วยมิลลิวินาทีไม่ใช่ไมโครวินาที
cabbi

0

หากคุณต้องการความเร็วลองสิ่งนี้:

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

precความแม่นยำอยู่ที่ไหน- คุณต้องการทศนิยมกี่ตำแหน่ง โปรดทราบว่าฟังก์ชันนี้ไม่มีปัญหาเกี่ยวกับเลขศูนย์นำหน้าในส่วนเศษส่วนเหมือนกับโซลูชันอื่น ๆ ที่นำเสนอที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.