#python #strftime
#питон #strftime
Вопрос:
У меня есть объект datetime, который печатается с помощью:
from datetime import datetime
ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").strip()
print('TS: {}'.format(ts))
# "2020-12-03 02:13:27.823467"
Однако я хочу, чтобы отображались только первые 2 цифры миллисекунд, например: 2020-12-03 02:13:27.82
. Использование « %.2f
» не сработало, и, возможно, есть другая функция времени, более подходящая?
Каков наилучший способ сделать это без введения (возможно, запаздывающих) манипуляций со строками регулярных выражений?
Ответ №1:
Как насчет чего-то вроде следующего?
import datetime
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S') '.{:02d}'.format(round(now.microsecond, -4))[:3]
print('TS: {}'.format(ts))
# TS: 2020-12-03 01:22:01.86
Редактировать
Возможно, лучшим параметризованным решением было бы:
import datetime
def largest_digits(value, num_digits=2, max_digits=6):
discard_digits = num_digits - max_digits
base = 10 ** -discard_digits
return f'{round(value, discard_digits) // base:02d}'
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S') '.' largest_digits(now.microsecond, 2)
print('TS: {}'.format(ts))
# TS: 2020-12-03 01:22:01.86
Комментарии:
1. Хороший! Спасибо. В конце концов, мне понадобилось 3 десятичных знака, поэтому я использовал:
'{:03d}'.format(round(t0.microsecond, -2))[:3]
.2. Не тот код, которым я больше всего горжусь, поскольку он плохо параметризован. Но ваши значения кажутся выключенными:
round(value, digit)
должно быть сdigit==3
для 3 десятичных знаков
Ответ №2:
Аааахи, ответ был тривиальным! Используйте выбор строки.
ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f").strip()[:-4]
Комментарии:
1. будьте осторожны с этим. В этом случае это может быть нормально, но если бы python не выводил нули для четных значений, вы бы убрали больше миллисекунд. семантически вы хотите округлить дату и время.
2. Спасибо. Хороший довод. Округление действительно было бы лучше, чем просто усечение. Так, может быть, округлить строку в ответе norok2?