Ответ 1
Написание чего-то подобного должно преобразовать дату твиттера в метку времени.
import time
ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
Я получаю сообщения Twitter, которые отправляются в определенную дату в следующем формате из twitter:
Tue Mar 29 08:11:25 +0000 2011
Я хочу сохранить эти даты в поле "метка времени с часовым поясом" в postgresql с полем DateTimeField djangos. Когда я храню эту строку, я получаю эту ошибку:
ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']
Могу ли я автоматически преобразовать тип данных twitter в время datetime python (которое работает в другом месте моего приложения для сохранения дат).
Написание чего-то подобного должно преобразовать дату твиттера в метку времени.
import time
ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
Отдайте это. Предполагается, что формат даты из твиттера соответствует требованиям RFC822 (см. Вопрос, связанный с @Adrien).
Создается объект наивного datetime (т.е. информация о часовом поясе). Он настраивается в соответствии с смещением часового пояса к UTC. Если вам не нужно сохранять исходный часовой пояс, я бы сохранил дату в формате UTC и формат по местному времени при ее отображении.
from datetime import datetime, timedelta
from email.utils import parsedate_tz
s = 'Tue Mar 29 08:11:25 +0000 2011'
def to_datetime(datestring):
time_tuple = parsedate_tz(datestring.strip())
dt = datetime(*time_tuple[:6])
return dt - timedelta(seconds=time_tuple[-1])
вы можете конвертировать дату с помощью datetime.strptime()
или time.strptime()
. однако эти две функции не могут проанализировать смещение часового пояса (см. эта ошибка).
Таким образом, единственное решение, которое я вижу, - это разделить дату самостоятельно, удалить смещение часового пояса, подать остальные на strptime()
и обработать смещение вручную...
посмотрите этот вопрос, где вы найдете несколько советов о том, как самостоятельно проанализировать смещение.
Следующий код напечатает красивую дату (по местному времени) из даты Twitter (UTC).
from datetime import datetime
from datetime import timezone
datetime.strptime(mydata["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
tzinfo=timezone.utc).astimezone(tz=None).strftime('%Y-%m-%d %H:%M:%S'))
Чтобы получить datetime с часовым поясом, вы можете просто использовать datetime.strptime следующим образом:
from datetime import datetime
s = 'Wed Jun 05 05:34:02 +0000 2019'
created_at = datetime.strptime(s, '%a %b %d %H:%M:%S %z %Y')
print(created_at)
#2019-06-05 05:34:02+00:00
Используя стратегию, аналогичную предложенной SoFolichon, в Python 3.x вы также можете использовать pytz
например:
from datetime import datetime, timezone
import pytz
datetime.strptime(tweets["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
tzinfo=timezone.utc).astimezone(pytz.timezone('US/Eastern')).strftime(
'%Y-%m-%d %H:%M:%S')
Как насчет этого? Это не требует форматирования строк.
import datetime
from email.utils import mktime_tz, parsedate_tz
def parse_datetime(value):
time_tuple = parsedate_tz(value)
timestamp = mktime_tz(time_tuple)
return datetime.datetime.fromtimestamp(timestamp)
print(parse_datetime('Tue Mar 29 08:11:25 +0000 2011'))
#2011-03-29 10:11:25
Моя система в GMT +2, следовательно, разница включена.
Немного стар, но использование синтаксического анализа действительно помогает мне в этом вопросе.
from datetime import datetime
from dateutil.parser import parse
date = 'Fri May 10 00:44:04 +0000 2019'
dt = parse(date)
print(dt)
# 2019-05-10 00:44:04+00:00
Первоначальная проблема, с которой я столкнулся, заключалась в преобразовании даты и времени, которые API-интерфейс Twitter дает String.
Следующие работы, в которых рассматриваются различные комментарии, которые, как кажется, есть у людей, относятся к вышеупомянутым решениям, в которых немного неясно, является ли дата начала уже в строковом формате или нет. Это работает для Python 2.7
При помощи твита от API tweet.created_at предоставляет дату в формате datetime. Вверху вашего файла добавьте from datetime import datetime
затем используйте следующее, чтобы получить соответствующую строку.
datetime.strftime(tweet.created_at,'%a %b %d %H:%M:%S %z %Y').
Затем вы можете использовать эту строку, как описано в других комментариях, чтобы манипулировать ею.