Форматирование микросекунд в два десятичных знака (фактически преобразование микросекунд в десятки микросекунд)

Я использую следующее, чтобы распечатать метки времени:

strftime('%d-%m-%Y %H:%M:%S.%f')

Однако я хочу округлить микросекунды до двух знаков после запятой, а не распечатывать до шести знаков после запятой. Есть ли более простой способ добиться этого, чем "распаковывать" все элементы времени, форматировать и округлять микросекунды до 2 десятичных знаков и форматировать новую "строку печати"?

3 ответа

Решение
decimal_places = 2
ndigits = decimal_places - 6
assert ndigits < 0
d = d.replace(microsecond=round(d.microsecond, ndigits))
print(d.strftime('%d-%m-%Y %H:%M:%S.%f')[:ndigits])
# -> 2014-10-27 11:59:53.87

Вы должны будете окружить себя; используйте форматирование строки для форматирования даты без микросекунд, затем добавьте две первые цифры microsecond атрибут отдельно:

'{:%d-%m-%Y %H:%M:%S}.{:02.0f}'.format(dt, dt.microsecond / 10000.0)

Демо-версия:

>>> from datetime import datetime
>>> dt = datetime.now()
>>> '{:%d-%m-%Y %H:%M:%S}.{:02.0f}'.format(dt, dt.microsecond / 10000.0)
'27-10-2014 11:56:32.72'

Основываясь на ответе JFS, я добавил еще одно утверждение как

replace(microsecond=round(d.microsecond, ndigits))

может выдать ошибку: ValueError: микросекунда должна быть в 0..999999.

то есть, если микросекунда от 995000 до 999999, раунд (микросекунда, ndigits) даст 1000000.

d = datetime.utcfromtimestamp(time.time())
decimal_places = 2
ndigits = decimal_places - 6
r = round(d.microsecond, ndigits)
if r > 999999:
    r = 999999
d = d.replace(microsecond=r)
ts = d.strftime('%Y-%m-%dT%H:%M:%S.%f')[:ndigits]
Другие вопросы по тегам