258 votes

Formatage d'une date en une chaîne de caractères avec des millisecondes

Comment puis-je formater un datetime en tant que chaîne de caractères avec des millisecondes ?

1 votes

4 votes

Veuillez rédiger un titre décrivant votre problème et essayez de poser une question claire et précise.

2 votes

Il convient de mentionner ici qu'une précision supplémentaire est souvent très utile. Par exemple, la fonction Instant.parse peut analyser les représentations créées avec strftime('%Y-%m-%dT%H:%M:%S.%fZ')

5voto

Waqas Ali Points 191
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)

<<<<<< SORTIE >>>>>>>

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

4voto

user1004488 Points 11

En python 3.6 et plus, l'utilisation de python f-strings :

from datetime import datetime, timezone

dt = datetime.now(timezone.utc)

print(f"{dt:%Y-%m-%d %H:%M:%S}.{dt.microsecond // 1000:03d}")

Le code spécifique au formatage des millisecondes est le suivant :

{dt.microsecond // 1000:03d}

La chaîne de format {:03d} et conversion de microseconde en milliseconde // 1000 provient de def _format_time en https://github.com/python/cpython/blob/master/Lib/datetime.py qui est utilisé pour datetime.datetime.isoformat() .

2voto

Austin Marshall Points 1104

Je suppose que vous cherchez quelque chose de plus rapide que datetime.datetime.strftime(), et que vous voulez essentiellement supprimer les caractères non alpha d'un timestamp utc.

Votre approche est légèrement plus rapide, et je pense que vous pouvez encore accélérer les choses en coupant la corde :

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

1voto

eyquem Points 9942
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:] "

résultat

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

Utilisation de translate() y tranchage méthode exécutée en même temps
translate() présente l'avantage d'être utilisable en une seule ligne

Comparer les temps sur la base du premier :

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

0,351 * str(t).replace('-','').replace(':','').replace('.','').replace(' ','')

0,198 * str(t).translate(None,' - :.')

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

1voto

omdaniel Points 11

J'ai rencontré le même problème, mais dans mon cas, il était important que la milliseconde soit arrondie et non tronquée.

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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X