Як конвертувати цілі часові позначки в час Python


189

У мене є файл даних, що містить часові позначки типу "1331856000000". На жаль, у мене не так багато документації щодо формату, тому я не впевнений у тому, як форматизована мітка часу. Я пробував стандарт мови Python datetime.fromordinal()і datetime.fromtimestamp()та кілька інших, але нічого матчі. Я впевнений, що конкретна кількість відповідає поточній даті (наприклад, 2012-3-16), але не набагато більше.

Як перетворити це число в a datetime?

Відповіді:


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)

Це відповідає на ваше запитання?

EDIT : JF Себастьян правильно запропонував використовувати справжній поділ на 1e3(float 1000). Різниця значна, якщо ви хочете отримати точні результати, тому я змінив свою відповідь. Різниця обумовлена ​​поведінкою Python 2.x за замовчуванням, яка завжди повертається intпри діленні (за допомогою /оператора) intна int(це називається діленням підлоги ). Замінивши дільник 1000(будучи an int) на 1e3дільник (представляючи його 1000як плаваючий) або на float(1000)(або 1000.тощо), поділ стає справжнім поділом . Python повертає 2.x , floatколи діляться intна float, floatпо int,floatі floatт. д. І коли в часовій мітці, переданій fromtimestamp()методу, є якась дробова частина , результат цього методу також містить інформацію про цю дробову частину (як кількість мікросекунд).


13
використовувати справжній поділ:/ 1e3
jfs

@JFSebastian: Ви абсолютно правильні, я відредагував свою відповідь і додав пояснення, чому ви маєте рацію. Якщо ви не згодні з поясненням, будь ласка, повідомте мене про це.
Тадек

@ manu-fatto: Це насправді не має значення. x * 0.001і x / 1e3обидва однакові, різниця полягає у позначенні та довжині (оригінальний - коротший). Для деяких людей може бути зрозуміліше насправді ділити на число, а не помножувати на множинне зворотне число ( 1/x), яке ви запропонували. Але дякую за пропозицію альтернативного підходу.
Тадек

58
Ця функція небезпечна, оскільки враховує часовий пояс. Спробуйте шукати utcfromtimestamp
Хаїм Бендер

12
@HaimBender Дякую! Я відчуваю, що ваші коментарі заслуговують на більшу увагу. fromtimestampдати вам дату та час за місцевим часом, utcfromtimestampдає вам дату та час у UTC.
yusong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.