Как конвертировать целую временную метку в Python datetime

189

У меня есть файл данных, содержащий метки времени, такие как «1331856000000». К сожалению, у меня не так много документации по формату, поэтому я не уверен, как форматируется метка времени. Я попробовал стандарт Python datetime.fromordinal()и datetime.fromtimestamp()несколько других, но ничего не подходит. Я уверен, что конкретное число соответствует текущей дате (например, 2012-3-16), но не намного.

Как мне преобразовать это число в datetime?

Cerin
источник

Ответы:

329

datetime.datetime.fromtimestamp()верно, за исключением того, что вы, вероятно, имеете метку времени в миллисекундах (как в JavaScript), но ожидаете fromtimestamp()метку времени Unix в секундах.

Сделай это так:

>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)

и результат:

>>> date
datetime.datetime(2012, 3, 16, 1, 0)

Это отвечает на ваш вопрос?

РЕДАКТИРОВАТЬ : JF Себастьян правильно предложил использовать истинное деление на 1e3(плавать 1000). Разница значительна, если вы хотите получить точные результаты, поэтому я изменил свой ответ. Разница заключается в поведении по умолчанию в Python 2.x, которое всегда возвращается intпри делении (используя /оператор) intна int(это называется делением по полу ). Заменяя делитель 1000(будучи int) 1e3делителем (являясь представлением 1000как float) или float(1000)(или 1000.т. Д.), Деление становится истинным делением . Python возвращает 2.x , floatкогда делящиеся intна float, floatпо int,floatи floatт. д. И когда в метке времени, передаваемой fromtimestamp()методу, есть некоторая дробная часть , результат этого метода также содержит информацию об этой дробной части (в виде числа микросекунд).

Tadeck
источник
13
используйте истинное деление:/ 1e3
JFS
@JFSebastian: Вы совершенно правы, я отредактировал свой ответ и добавил несколько объяснений, почему вы правы. Если вы не согласны с объяснением, пожалуйста, дайте мне знать.
Tadeck
@ Manu-FATTO: Это не имеет значения. x * 0.001и x / 1e3оба одинаковы, разница в обозначениях и длине (оригинал короче). Для некоторых людей может быть более понятно делить на число вместо умножения на умноженное на обратное число ( 1/x), которое вы предложили. Но спасибо за предложение альтернативного подхода.
Tadeck
58
Эта функция опасна, потому что учитывает часовой пояс. Попробуйте поискать utcfromtimestamp
Хаим Бендер
12
@HaimBender Спасибо! Я чувствую, что ваши комментарии заслуживают большего внимания. fromtimestampдает вам дату и время по местному времени, utcfromtimestampдает вам дату и время в UTC.
yusong