Как я могу сократить миллисекунды до 2 наиболее значимых десятичных знаков в strftime()

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