Bir tarih saatini milisaniye ile bir dizeye biçimlendirme


169

datetimeMilisaniye ile bugünden bir dize istiyorum . Bu kod benim için tipik ve onu kısaltmayı öğrenmek için sabırsızlanıyorum.

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
Lütfen sorununuzu tanımlayan bir başlık yazın ve sorunuzu açık ve net tutmaya çalışın.
agf

Burada ekstra hassasiyetin genellikle iyi olduğunu belirtmek gerekir. Örneğin, Instant.parsestrftime('%Y-%m-%dT%H:%M:%S.%fZ')
Java'lar

Yanıtlar:


356

Milisaniye (saniyenin arkasında 3 ondalık basamak) içeren bir tarih dizesi almak için şunu kullanın:

from datetime import datetime

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

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

Not: Python3 printiçin parantez gerektirir:

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

1
Net olmak gerekirse, 2013-08-23 10:18:32.926çıktısıdır print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] .
Jaan

3
Not, import datetimebunun yerine kullanmak istiyorsanız, bunu kullanmanız from datetime import datetimegerekecek:datetime.datetime.utcnow().strftime("%H:%M:%S.%f")
Luc

17
Mikrosaniyelerin 0 olması durumunda, Windows 2.7 uygulamasında mikrosaniyeler yazdırılmaz, böylece saniyeleri
keser

8
bunun kesildiğini, milisaniyeye yuvarlanmadığını unutmayın
gens

2
Jen den bahsedildiği gibi, bu yanlış olmaz mı ilk damla sayısı> = 5 ?. Aslında, usec kısmı 999500'den fazlaysa, o zaman mikrosaniye kısmı ile uğraşarak zamanı doğru elde edemezsiniz
Chris

59

Python 3.6 ile şunları kullanabilirsiniz:

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

Çıktı:

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

Daha fazla bilgi için: https://docs.python.org/3/library/datetime.html#datetime.datetime.isoformat


Saat dilimi için de yararlı: date = datetime (2019,5,10) date_with_tz = pytz.timezone ('Avrupa / Roma'). Yerelleştir (tarih) date_with_tz.isoformat (sep = 'T', timespec = 'milisaniye') çıktı: '2019-05-10T00: 00: 00.000 + 02: 00'
Ena

Bu kabul edilmesi gereken gerçek çözümdür. Ve isoformat () GPX formatına ihracat için ihtiyacım olan şey, çok teşekkürler!
Filip Mutlu

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

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


13
Bilginize, bu son 6 basamak olarak mikrosaniye yazdırır. [:-3]Son 3 basamağı yalnızca milisaniye görüntüleyecek şekilde bırakmak için sonuna ekleyin .
Mark Lakata

5
mikrosaniye 6 basamaktan az olabilir, bu nedenle [: -3] yanlış milisaniye yazdırıyor
cabbi

13
saat dilimimiz varsa ne olur?
ᐅ devrimbaris

1
@ ᐅ devrimbaris zaman dilimi ödeme Lorenzo'nun yanıtı
Ena

17

@Cabbi, bazı sistemlerde mikrosaniye biçiminin %fverebileceği sorununu gündeme getirdi "0", bu nedenle son üç karakteri kesmek taşınabilir değildir.

Aşağıdaki kod, bir zaman damgasını milisaniye ile dikkatlice biçimlendirir:

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

Örnek Çıktı:

2016-02-26 04:37:53.133

OP'nin tam olarak istediği çıktıyı elde etmek için noktalama karakterlerini soymalıyız:

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

Örnek Çıktı:

20160226043839901

6
Aslında yaptığım şudur: '% s.% 03d'% (dt.strftime ("% Y-% m-% d% H:% M:% S"), int (dt.microsecond / 1000) ))
cabbi

2
@cabbi ile aynı fikirdeyseniz, string ve int ile ileri geri dönüş yapmanıza gerek yoktur
18:15

evet ben de katılıyorum ... :)
Sam Watkins

1
Bu cevap diğerlerinden çok daha kesin ve güvenlidir. Teşekkürler !
Hunaphu

5

Muhtemelen şöyle:

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.

İkincisi bir %molmalı %M, çünkü ay değil, dakika.
Michael Dorner

2

Demek istiyorum ki datetime.datetime.strftime () 'den daha hızlı bir şey arıyorsunuz ve alfa olmayan karakterleri bir utc zaman damgasından sıyırıyorsunuz.

Yaklaşımınız daha hızlı ve sanırım ipi dilimleyerek işleri daha da hızlandırabilirsiniz:

>>> 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 İyi iş çıkardın. Şahsen, artık zamanı ölçmek için timeit kullanmıyorum. 0,53 ve mayın ile - 0,67-1: 1-0,35 - 0.20, yöntemleri için bu kez oranları, kodunuzu farklı olduğunu garip strftime - değiştirme - dilimleme
Eyquem

Belki str'nin (datetime.datetime.utcnow ()) testin her yinelemesinde çağrıldığında veya bir kez ayarlanmasıyla ilgili bir şey var mı?
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:] "

sonuç

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

Kullanımı (tercüme) ve dilimleme aynı zamanda yöntem çalıştırma
) (tercüme avantaj sunar bir satır kullanılabilir olması için

İlkine göre zamanları karşılaştırma:

1.000 * t. Devre arası ('% Y% m% d% H% M% S% f')

0.351 * str (t). Değiştirin ('-', ''). Değiştirin (':', ''). Değiştirin ('.', ''). Değiştirin ('', '')

0.198 * str (t). Çeviri (Yok, '- :.')

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


1
Güzel! Bu, performanstan ödün vermeden gerçekten daha temiz. testimde str.translate () aslında daha hızlı.
Austin Marshall

1

Aynı sorunu ele aldım ama benim durumumda milisaniyenin yuvarlanması ve kesilmemesi önemliydi

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)

<<<<<< ÇIKTI >>>>>>>

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

Sorun datetime.utcnow()ve diğer çözümlerin yavaş olması.

Daha verimli çözüm şöyle görünebilir:

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

Sizin durumunuzda nerede precolurdu 3(milisaniye).

İşlev 9 ondalık basamağa kadar çalışır (lütfen 92. biçimlendirme dizesindeki sayıyı not edin ).

Kesirli kısmı yuvarlamak isterseniz "%.9f", istenen sayıda ondalık basamakla dinamik olarak oluşturmanızı öneririm .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.