2015-07-21 2 views
-2

Вот как выглядит временная метка -Преобразования метки времени на сегодняшний день UNIX питон

2015-07-17 06:01:51.066141+00:00 

Я оглянувшись, чтобы преобразовать это в UNIX время даты.

datetime.strptime("2015-07-17 06:01:51.066141+00:00", "%Y-%m-%d %H:%M:%S.%f%z").strftime("%s") 

ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S.%f%z' 

вызывает ошибку для меня, возможно, из-за неправильного формата.

PS: мой virtualenv на Python 2.7

идеи, пожалуйста?

+1

https: // документы .python.org/2/library/datetime.html # strftime-and-strptime-behavior – Alik

+0

Вы даже прочитали документ, прежде чем спрашивать? Или [посмотрел на сторонние библиотеки] (https://pypi.python.org/pypi?%3Aaction=search&term=date+parsing&submit=search)? – bufh

+0

Я дал, что try-get - ValueError: данные времени '2015-07-17 06: 01: 51.066141 + 00: 00' не соответствует формату '% Y-% m-% d% H:% M:% S .% f +% Z ' – user2119554

ответ

1

strptime() не имеет поддержки для часовых поясов. Таким образом, вы можете сделать преобразование игнорируя часовой пояс следующим образом:

datetime.strptime("2015-07-17 06:01:51.066141", "%Y-%m-%d %I:%M:%S.%f").strftime("%s") 
'1437102111' 

Или для того, чтобы избежать использования% с, как предложено ниже в commments:

from datetime import datetime 
(datetime.strptime("2015-07-17 06:01:51.066141", "%Y-%m-%d %I:%M:%S.%f") - datetime(1970, 1, 1)).total_seconds() 
1437112911.066141 

Обратите внимание, что это рабочая версия для Python 2, вы также можете проверить решения для других версий. here

В противном случае вам придется использовать другие библиотеки (django.utils или email.utils), которые поддерживают часовые пояса, или самостоятельно выполняют разбор часового пояса.

P.S.:

Как представляется, strptime docs имеет поддержку часового пояса, но на самом деле он не был реализован. Попробуйте:

datetime.strptime("2015-07-17 06:01:51.066141+00:00", "%Y-%m-%d %I:%M:%S.%f%z").strftime("%s") 

, и вы увидите, что он не поддерживается. Вы также можете проверить его, выполнив поиск более подробно о strptime()

+0

Неправильно, datetime поддерживает часовые пояса типа '+ 0530' (без пробела **: ** между ними), используйте для этого'% z'. –

+1

И python не поддерживает символ '% s', то есть артефакт функции' strftime() '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '). И это работает только в Linux. –

+0

Йе, звучит. – user2119554

1

Невозможно проанализировать дату. Вам нужно будет вручную разобрать его, найти другую библиотеку (например, метод dateutil.parser.parse, который будет анализировать вашу строку напрямую, не поставляя строку формата), которая поддерживает этот формат, или делает отметку времени в другом формате. Даже с более новыми версиями python директива %z не принимает смещения TZ в формате +/-HH:MM (с двоеточием).

В качестве источника отметки времени django.DateTimeField возможно this question can help?

Для преобразования в Отметка времени Unix вы, кажется, делать какую-то работу, так как там, кажется, не является прямым методом, что:

(t - datetime.utcfromtimestamp(0)).total_seconds() 

где t является datetime (при условии, что это в UTC и есть no tzinfo), которую вы хотите преобразовать в метку времени POSIX. Если предположение неверно, вам нужно положить tzinfo в нулевую метку времени, которую вы вычтите, как показано ниже, где предположение не выполняется.

Если вы хотите использовать dateutil.parser полное решение будет:

(dateutil.parser.parse(timestamp) - datetime.utcfromtimestamp(0).replace(tzinfo=utc()).total_seconds() 
+0

при создании объекта datetime, у меня все еще стоит проблема - datetime.datetime.strptime ("2015 -07-17 06: 01: 51.066141 + 00: 00 ","% Y-% m-% d% H:% M:% S.% f% z ") ValueError: 'z' является плохой директивой в формате «% Y-% m-% d% H:% M:% S.% f% z ' – user2119554

+0

@ user2119554 Да, я знаю, что вам нужно использовать один из трех вариантов для разбора отметки времени, о которой я упоминал (прямое использование модуля 'datetime' не будет работать). Откуда вы взяли временную метку? – skyking

+0

его создание с помощью моделей.DateTimeField – user2119554

1

Для Python 2.7 использование arrow:

import arrow  
date_str = "2015-07-17 06:01:51.066141+00:00" 
unix_time = arrow.get(date_str).timestamp 

На PY3 (проверено на 3.4), используя только standard libs

Строка даты, которую вы показываете wi ll не анализируется стандартной библиотекой datetime python, так как она имеет двоеточие в часовом поясе (см. here). Двоеточие можно легко удалить, поскольку оно всегда находится в одном и том же положении (или используйте rfind, чтобы найти его индекс, начинающийся справа). Ваше простое решение:

import datetime 

date_str = "2015-07-17 06:01:51.066141+00:00" 

date_str_no_colon = date_str[:-3]+date_str[-2:] # remove last colon 
dt_obj = datetime.datetime.strptime(date_str_no_colon, "%Y-%m-%d %H:%M:%S.%f%z") 
unix_time = dt_obj.timestamp() 

Обратите внимание, что стрелка должна по-прежнему работать с PY3, и является лучшим решением в общ- вы не хотите, чтобы попасть в разборе даты и времени войн с питоном. Это будет победить.

+0

вызывает такую ​​же ошибку - ValueError: 'z' является плохой директивой в формате '% Y-% m-% d% H:% M:% S.% f% z' – user2119554

+0

интересно! Я работаю над python 3.4, отлично работает. И вы правы, я подтвердил, что он не работает с 2.7 .. –

+0

Это решение основывается на более новой версии python, однако я думаю, что это шаг в правильном направлении. При использовании 'datetime' для синтаксического анализа метки времени вам придется сделать аналогичное обходное решение для смещения часового пояса. Например, вы можете использовать 'datetime' для разбора смещения UTC и остальной части временной метки отдельно, а затем объединить результаты. – skyking

2

python 2.7 strptime() не поддерживает директиву z, либо вы можете использовать python 3.2+ или какую-либо другую стороннюю библиотеку, такую ​​как dateutil.

+2

'dateutil.parser.parse (" 2015-07-17 06: 01: 51.066141 + 00: 00 ")' работает магически ... – skyking

+0

примечание: '% z' не понимает двоеточие в смещении utc даже в Python 3.2+, см. [Преобразование временных меток со смещением в datetime obj с использованием' strptime'] (http://stackoverflow.com/q/12281975/4279) – jfs

0

Есть две части:

  • преобразовать "2015-07-17 06:01:51.066141+00:00" в объект даты и времени, который представляет время в формате UTC, см Convert timestamps with offset to datetime obj using strptime. Или если вы знаете, что смещение UTC всегда +0000:

    from datetime import datetime 
    
    utc_time = datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S.%f+00:00") 
    
  • для преобразования времени UTC в POSIX метки времени (Unix времени), см Converting datetime.date to UTC timestamp in Python:

    from datetime import datetime 
    
    timestamp = (utc_time - datetime(1970, 1, 1)).total_seconds() 
    
Смежные вопросы