จัดรูปแบบวันที่และเวลาลงในสตริงด้วยมิลลิวินาที


169

ฉันต้องการdatetimeสตริงจากวันที่ด้วยมิลลิวินาที รหัสนี้เป็นเรื่องปกติสำหรับฉันและฉันอยากเรียนรู้วิธีย่อให้สั้นลง

from datetime import datetime

timeformatted= str(datetime.utcnow())
semiformatted= timeformatted.replace("-","")
almostformatted= semiformatted.replace(":","")
formatted=almostformatted.replace(".","")
withspacegoaway=formatted.replace(" ","")
formattedstripped=withspacegoaway.strip()
print formattedstripped


3
โปรดเขียนชื่อเรื่องที่อธิบายถึงปัญหาของคุณและพยายามทำให้คำถามของคุณชัดเจนและตรงประเด็น
agf

เป็นมูลค่าการกล่าวถึงที่นี่ว่าแม่นยำพิเศษมักจะดี ตัวอย่างเช่น Java's Instant.parseสามารถวิเคราะห์คำstrftime('%Y-%m-%dT%H:%M:%S.%fZ')
ซ้ำที่

คำตอบ:


355

ในการรับสตริงวันที่ด้วยมิลลิวินาที (ทศนิยม 3 ตำแหน่งหลังวินาที) ให้ใช้สิ่งนี้:

from datetime import datetime

print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

>>>> OUTPUT >>>>
2020-05-04 10:18:32.926

หมายเหตุ: สำหรับ Python3 printต้องใช้วงเล็บ:

print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])

1
จะแม่นยำ คือการส่งออกของ2013-08-23 10:18:32.926 print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
Jaan

3
หมายเหตุหากคุณต้องการใช้import datetimeแทนคุณfrom datetime import datetimeจะต้องใช้สิ่งนี้:datetime.datetime.utcnow().strftime("%H:%M:%S.%f")
Luc

17
ในกรณีที่ microseconds เป็น 0, ใน windows 2.7 microseconds ในการใช้งานจะไม่ถูกพิมพ์ออกมาดังนั้นมันจึงจดจ้องวินาที :(
cabbi

8
โปรดทราบว่าการตัดทอนนี้ไม่ปัดเศษเป็นมิลลิวินาที
วงศ์

2
ในฐานะที่เป็นคนพูดถึงสิ่งนี้จะไม่ผิดหรือเปล่าที่จำนวนหยดแรกคือ> = 5 ในความเป็นจริงถ้าส่วน usec คือ> 999500 คุณจะไม่ได้เวลาที่เหมาะสมด้วยการเล่นซอส่วน microsecond
Chris

59

ด้วย Python 3.6 คุณสามารถใช้:

from datetime import datetime
datetime.utcnow().isoformat(sep=' ', timespec='milliseconds')

เอาท์พุท:

'2019-05-10 09:08:53.155'

ข้อมูลเพิ่มเติมที่นี่: https://docs.python.org/3/library/datetime.html#datetime.datetime.isoformat


มีประโยชน์กับเขตเวลาด้วย: date = datetime (2019,5,10) date_with_tz = pytz.timezone ('ยุโรป / โรม'). จำกัด วง (วันที่) date_with_tz.isoformat (sep = 'T', timespec = 'milliseconds') '2019-05-10T00: 00: 00.000 + 02: 00'
Ena

นี่คือทางออกที่แท้จริงที่ควรได้รับการยอมรับ และisoformat ()เป็นสิ่งที่ฉันต้องการเพื่อส่งออกไปยังรูปแบบ GPX ขอบคุณมาก!
ฟิลิปปินส์มีความสุข

22
print datetime.utcnow().strftime('%Y%m%d%H%M%S%f')

http://docs.python.org/library/datetime.html#strftime-strptime-behavior


13
FYI นี่พิมพ์ไมโครวินาทีเป็นตัวเลข 6 ตัวสุดท้าย เพิ่ม[:-3]ไปยังจุดสิ้นสุดเพื่อวางตัวเลข 3 หลักสุดท้ายเพื่อให้แสดงเป็นมิลลิวินาทีเท่านั้น
Mark Lakata

5
microseconds อาจน้อยกว่า 6 หลักดังนั้น [: -3] กำลังพิมพ์ผิดมิลลิวินาที
cabbi

13
เกิดอะไรขึ้นถ้าเรามีเขตเวลา
ᐅ devrimbaris

1
@ ᐅ devrimbaris สำหรับคำตอบการกรอกข้อมูลในเขตเวลา Lorenzo
Ena

17

@Cabbi แจ้งปัญหาที่เกิดขึ้นในบางระบบรูปแบบไมโครวินาที%fอาจให้"0"ดังนั้นจึงไม่ใช่เรื่องง่ายที่จะตัดออกจากสามตัวอักษรสุดท้าย

รหัสต่อไปนี้จัดรูปแบบการประทับเวลาด้วยมิลลิวินาทีอย่างรอบคอบ:

from datetime import datetime
(dt, micro) = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f').split('.')
dt = "%s.%03d" % (dt, int(micro) / 1000)
print dt

ตัวอย่างผลลัพธ์:

2016-02-26 04:37:53.133

เพื่อให้ได้ผลลัพธ์ที่แน่นอนที่ OP ต้องการเราต้องตัดอักขระเครื่องหมายวรรคตอน:

from datetime import datetime
(dt, micro) = datetime.utcnow().strftime('%Y%m%d%H%M%S.%f').split('.')
dt = "%s%03d" % (dt, int(micro) / 1000)
print dt

ตัวอย่างผลลัพธ์:

20160226043839901

6
สิ่งที่ฉันกำลังทำอยู่คือพิมพ์ '% s.% 03d'% (dt.strftime ("% Y-% m-% d% H:% M:% S"), int (dt.microsecond / 1000 ))
cabbi

2
เห็นด้วยกับ @cabbi ไม่จำเป็นต้องแปลงกลับไปกลับมาด้วย string และ int
caoanan

ใช่ฉันเห็นด้วยเช่นกัน ... :)
Sam Watkins

1
คำตอบนี้แม่นยำและปลอดภัยกว่าคำตอบอื่น ๆ ขอบคุณมาก!
Hunaphu

5

อาจเป็นเช่นนี้

import datetime
now = datetime.datetime.now()
now.strftime('%Y/%m/%d %H:%M:%S.%f')[:-3]  
# [:-3] => Removing the 3 last characters as %f is for microsecs.

ครั้งที่สอง%mจะต้องเป็น%Mเพราะเป็นนาทีไม่ใช่เดือน
Michael Dorner

2

ฉันคิดว่าคุณหมายถึงคุณกำลังมองหาบางสิ่งที่เร็วกว่า datetime.datetime.strftime () และเป็นการลอกอักขระที่ไม่ใช่อัลฟาออกจากการประทับเวลา utc

คุณเข้าใกล้เร็วกว่าเล็กน้อยและฉันคิดว่าคุณสามารถเร่งความเร็วได้มากขึ้นโดยการแบ่งสตริง:

>>> import timeit
>>> t=timeit.Timer('datetime.utcnow().strftime("%Y%m%d%H%M%S%f")','''
... from datetime import datetime''')
>>> t.timeit(number=10000000)
116.15451288223267

>>> def replaceutc(s):
...     return s\
...         .replace('-','') \
...         .replace(':','') \
...         .replace('.','') \
...         .replace(' ','') \
...         .strip()
... 
>>> t=timeit.Timer('replaceutc(str(datetime.datetime.utcnow()))','''
... from __main__ import replaceutc
... import datetime''')
>>> t.timeit(number=10000000)
77.96774983406067

>>> def sliceutc(s):
...     return s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:]
... 
>>> t=timeit.Timer('sliceutc(str(datetime.utcnow()))','''
... from __main__ import sliceutc
... from datetime import datetime''')
>>> t.timeit(number=10000000)
62.378515005111694

@ oxtopus ทำงานได้ดี โดยส่วนตัวแล้วฉันไม่ได้ใช้timeitอีกต่อไปสำหรับการวัดเวลาอย่างง่าย ๆ มันแปลกที่อัตราส่วนของเวลาที่มีความแตกต่างกับรหัสของคุณ: 1 - 0.67-0.53 และเหมือง: 1 - 0.35-0.20 สำหรับวิธีการstrftime - เปลี่ยน - หั่น
eyquem

อาจจะเกี่ยวข้องกับ str (datetime.datetime.utcnow ()) ในการทำซ้ำแต่ละครั้งของการทดสอบ vs การตั้งค่าครั้งเดียว?
Austin Marshall

1
from datetime import datetime
from time import clock

t = datetime.utcnow()
print 't == %s    %s\n\n' % (t,type(t))

n = 100000

te = clock()
for i in xrange(1):
    t_stripped = t.strftime('%Y%m%d%H%M%S%f')
print clock()-te
print t_stripped," t.strftime('%Y%m%d%H%M%S%f')"

print

te = clock()
for i in xrange(1):
    t_stripped = str(t).replace('-','').replace(':','').replace('.','').replace(' ','')
print clock()-te
print t_stripped," str(t).replace('-','').replace(':','').replace('.','').replace(' ','')"

print

te = clock()
for i in xrange(n):
    t_stripped = str(t).translate(None,' -:.')
print clock()-te
print t_stripped," str(t).translate(None,' -:.')"

print

te = clock()
for i in xrange(n):
    s = str(t)
    t_stripped = s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:] 
print clock()-te
print t_stripped," s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:] "

ผลลัพธ์

t == 2011-09-28 21:31:45.562000    <type 'datetime.datetime'>


3.33410112179
20110928212155046000  t.strftime('%Y%m%d%H%M%S%f')

1.17067364707
20110928212130453000 str(t).replace('-','').replace(':','').replace('.','').replace(' ','')

0.658806915404
20110928212130453000 str(t).translate(None,' -:.')

0.645189262881
20110928212130453000 s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:]

ใช้การแปล ()และวิธีการแบ่งส่วนในเวลาเดียวกัน
แปล ()นำเสนอข้อดีที่สามารถใช้งานได้ในหนึ่งบรรทัด

เปรียบเทียบเวลาบนพื้นฐานของคนแรก:

1.000 * t เวลาเริ่มต้น ('% Y% m% d% H% M% S% f')

0.351 * str (t) .replace ('-', ''). แทนที่ (':', ''). แทนที่ ('.', ''). แทนที่ ('', '')

0.198 * str (t) .translate (ไม่มี, '-:.')

0.194 * s [: 4] + s [5: 7] + s [8:10] + s [11:13] + s [14:16] + s [17:19] + s [20:]


1
ดี! นั่นสะอาดกว่าแน่นอนโดยไม่ต้องเสียสละประสิทธิภาพ str.translate () เร็วขึ้นจริง ๆ ในการทดสอบของฉัน
Austin Marshall

1

ฉันจัดการกับปัญหาเดียวกัน แต่ในกรณีของฉันมันเป็นสิ่งสำคัญที่มิลลิวินาทีถูกปัดเศษและไม่ถูกตัดทอน

from datetime import datetime, timedelta

def strftime_ms(datetime_obj):
    y,m,d,H,M,S = datetime_obj.timetuple()[:6]
    ms = timedelta(microseconds = round(datetime_obj.microsecond/1000.0)*1000)
    ms_date = datetime(y,m,d,H,M,S) + ms
    return ms_date.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

1
import datetime

# convert string into date time format.

str_date = '2016-10-06 15:14:54.322989'
d_date = datetime.datetime.strptime(str_date , '%Y-%m-%d %H:%M:%S.%f')
print(d_date)
print(type(d_date)) # check d_date type.


# convert date time to regular format.

reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

<<<<<< ผลลัพธ์ >>>>>>>

2016-10-06 15:14:54.322989    
<class 'datetime.datetime'>    
06 October 2016 03:14:54 PM    
2016-10-06 03:14:54 PM    
2016-10-06 15:14:54



0

ปัญหากับdatetime.utcnow()และวิธีแก้ปัญหาอื่น ๆ คือพวกมันช้า

โซลูชันที่มีประสิทธิภาพมากขึ้นอาจมีลักษณะเช่นนี้:

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จะเป็น3ในกรณีของคุณ (มิลลิวินาที)

ฟังก์ชั่นนี้ใช้งานได้ถึง 9 ตำแหน่งทศนิยม (โปรดทราบหมายเลข9ในสตริงการจัดรูปแบบที่ 2)

หากคุณต้องการปัดเศษเศษส่วนฉันขอแนะนำให้สร้าง"%.9f"แบบไดนามิกด้วยจำนวนทศนิยมที่ต้องการ

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