Форматирование микросекунд в два десятичных знака (фактически преобразование микросекунд в десятки микросекунд)
Я использую следующее, чтобы распечатать метки времени:
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]