Định dạng một datetime thành một chuỗi với mili giây


169

Tôi muốn có một datetimechuỗi từ ngày với mili giây. Mã này là điển hình cho tôi và tôi rất muốn học cách rút ngắn nó.

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
Vui lòng viết một tiêu đề mô tả vấn đề của bạn và cố gắng giữ cho câu hỏi của bạn rõ ràng và đi vào vấn đề.
agf

Điều đáng nói ở đây là độ chính xác cao thường chỉ tốt. Ví dụ: Java Instant.parsecó thể phân tích cú pháp hồi quy được tạo bằngstrftime('%Y-%m-%dT%H:%M:%S.%fZ')
Jarek Przygódzki

Câu trả lời:


353

Để có được chuỗi ngày có mili giây (3 chữ số thập phân sau giây), hãy sử dụng:

from datetime import datetime

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

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

Lưu ý: Đối với Python3, printyêu cầu dấu ngoặc đơn:

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

1
Nói chính xác, 2013-08-23 10:18:32.926là đầu ra của print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] .
Jaan

3
Lưu ý, nếu bạn muốn sử dụng import datetimethay vì from datetime import datetime, bạn sẽ phải sử dụng điều này:datetime.datetime.utcnow().strftime("%H:%M:%S.%f")
Luc

17
Trong trường hợp micro giây là 0, trong cửa sổ 2.7, micrô giây thực hiện không được in ra nên nó cắt giây :(
cabbi

8
lưu ý rằng việc cắt ngắn này, không làm tròn đến mili giây
gens

2
Như gens đề cập, điều này sẽ không làm cho nó sai, số giọt đầu tiên là> = 5?. Trong thực tế nếu phần usec là> 999500, thì bạn sẽ không bao giờ có được thời gian đúng bằng cách thay đổi phần micrô giây
Chris

59

Với Python 3.6, bạn có thể sử dụng:

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

Đầu ra:

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

Thêm thông tin tại đây: https://docs.python.org/3/l Library / datetime.html # datetime.datetime.isoformat


Cũng hữu ích với múi giờ: date = datetime (2019,5,10) date_with_tz = pytz.timezone ('Châu Âu / Rome'). '2019-05-10T00: 00: 00.000 + 02: 00'
Ena

Đây là giải pháp thực tế nên được chấp nhận. Và isoformat () là thứ tôi cần để xuất sang định dạng GPX, cảm ơn rất nhiều!
Filip Chúc mừng

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

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


13
FYI, điều này in ra micro giây là 6 chữ số cuối. Thêm [:-3]vào cuối để thả 3 chữ số cuối cùng để nó chỉ hiển thị mili giây.
Đánh dấu Lakata

5
micro giây có thể nhỏ hơn 6 chữ số, vì vậy [: -3] đang in sai mili giây
cabbi

13
Nếu chúng ta có múi giờ thì sao?
devrimbaris ngày

1
@ Devrimbaris để kiểm tra múi giờ Câu trả lời của Lorenzo
Ena

17

@Cabbi nêu ra vấn đề rằng trên một số hệ thống, định dạng micro giây %fcó thể cung cấp "0", do đó, nó không khả dụng để cắt bỏ ba ký tự cuối cùng.

Đoạn mã sau định dạng cẩn thận dấu thời gian với mili giây:

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

Kết quả ví dụ:

2016-02-26 04:37:53.133

Để có được đầu ra chính xác mà OP muốn, chúng ta phải loại bỏ các ký tự dấu chấm câu:

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

Kết quả ví dụ:

20160226043839901

6
Những gì tôi thực sự đang làm là: in '% s.% 03d'% (dt.strftime ("% Y-% m-% d% H:% M:% S"), int (dt.microsecond / 1000 ))
Cabbi

2
đồng ý với @cabbi, không cần phải chuyển đổi qua lại với chuỗi và int
caoanan

vâng tôi cũng đồng ý ... :)
Sam Watkins

1
Câu trả lời này chính xác và an toàn hơn nhiều so với những câu hỏi khác. Cảm ơn !
Hunaphu

5

Có lẽ như thế này:

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.

Thứ hai %mphải là a %M, vì nó là phút chứ không phải tháng.
Michael D Corner

2

Tôi giả sử bạn có nghĩa là bạn đang tìm kiếm thứ gì đó nhanh hơn datetime.datetime.strftime () và về cơ bản là tước các ký tự không phải alpha từ dấu thời gian utc.

Cách tiếp cận của bạn nhanh hơn một chút và tôi nghĩ bạn có thể tăng tốc mọi thứ hơn nữa bằng cách cắt chuỗi:

>>> 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 Làm tốt lắm. Cá nhân, tôi không sử dụng timeit nữa để đo thời gian đơn giản. Thật kỳ lạ khi tỷ lệ thời gian khác với mã của bạn: 1 - 0,67 - 0,53 và với tỷ lệ của tôi: 1 - 0,35 - 0,20, đối với các phương thức strftime - thay thế - cắt
eyquem

Có lẽ phải làm gì đó với str (datetime.datetime.utcnow ()) được gọi trong mỗi lần lặp lại của bài kiểm tra so với đặt nó một lần?
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:] "

kết quả

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

Sử dụng phương thức dịch () và phương thức cắt chạy trong cùng thời gian
dịch () thể hiện lợi thế có thể sử dụng được trong một dòng

So sánh thời gian trên cơ sở của lần đầu tiên:

1.000 * t.strftime ('% Y% m% d% H% M% S% f')

0.351 * str (t) .replace ('-', ''). Thay thế (':', ''). Thay thế ('.', ''). Thay thế ('', '')

0.198 * str (t) .transTable (Không có, '-:.')

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


1
Đẹp! Đó thực sự là sạch hơn mà không phải hy sinh hiệu suất. str.translate () thực sự nhanh hơn trong thử nghiệm của tôi.
Austin Marshall

1

Tôi đã xử lý vấn đề tương tự nhưng trong trường hợp của tôi, điều quan trọng là mili giây đã được làm tròn và không bị cắt ngắn

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)

<<<<<< ĐẦU RA >>>>>>>

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

1
python -c "from datetime import datetime; print str(datetime.now())[:-3]"
2017-02-09 10:06:37.006

0
datetime
t = datetime.datetime.now()
ms = '%s.%i' % (t.strftime('%H:%M:%S'), t.microsecond/1000)
print(ms)
14:44:37.134

0

Vấn đề với datetime.utcnow()và các giải pháp khác như vậy là chúng chậm.

Giải pháp hiệu quả hơn có thể giống như thế 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

Trường hợp của bạn precsẽ 3ở đâu (mili giây).

Hàm hoạt động tối đa 9 vị trí thập phân (xin lưu ý số 9trong chuỗi định dạng thứ 2).

Nếu bạn muốn làm tròn phần phân số, tôi khuyên bạn nên xây dựng linh hoạt "%.9f"với số vị trí thập phân mong muốn.

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.