Форматирование даты и времени в строку с миллисекундами
Я хочу 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
10 ответов:
чтобы получить строку даты с миллисекундами (3 десятичных знака за секундами), используйте это:
from datetime import datetime print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] >>>> OUTPUT >>>> 2018-10-04 10:18:32.926
print datetime.utcnow().strftime('%Y%m%d%H%M%S%f')
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
@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
наверное, такой :
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.
Я предполагаю, что вы имеете в виду, что вы ищете что-то быстрее, чем 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
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. strftime ('%Y%m%d%H%M%S%f')
0.351 * str (t).заменять.)'','-'(заменять.)'',':'(заменять.'(',").заменять'( ',")
0.198 * str (t).перевести(нет,' -:.')
0.194 * s[:4] + s[5: 7] + s[8: 10] + s[11: 13] + s[14:16] + s[17: 19] + s[20:]
Я имел дело с той же проблемой, но в моем случае было важно, чтобы миллисекунда была округлена, а не усечена
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]
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
просто использовать
datetime.datetime.strftime()
С соответствующей строкой формата.