Переход от даты в твиттере к дате в Python - PullRequest
40 голосов
/ 09 октября 2011

Я получаю твиттер-сообщения, которые отправляются на определенную дату в следующем формате из твиттера:

Tue Mar 29 08:11:25 +0000 2011

Я хочу сохранить эти даты в поле 'timestamp with time zone' в postgresql с djangos DateTimeFieldполе.Однако, когда я сохраняю эту строку, я получаю эту ошибку:

ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']

Могу ли я автоматически преобразовать тип даты в твиттере в дату и время Python (это работает в другом месте моего приложения для сохранения дат).

Ответы [ 9 ]

59 голосов
/ 10 октября 2011

Запись чего-то подобного должна преобразовать дату твиттера в метку времени.

import time

ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
13 голосов
/ 09 октября 2011

Дайте это.Предполагается, что формат даты из твиттера соответствует RFC822 (см. Вопрос, связанный с @Adrien).

Создается наивный объект даты-времени (т.е. информация о часовом поясе отсутствует)Он настраивается в соответствии со смещением часового пояса в 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])
2 голосов
/ 06 июня 2019

Чтобы получить дату и время с часовым поясом, вы можете просто использовать 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
2 голосов
/ 09 октября 2011

вы можете конвертировать дату, используя datetime.strptime() или time.strptime().однако эти две функции не могут анализировать смещение часового пояса (см. эту ошибку ).

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

посмотрите на этот вопрос , где вы найдете несколько советов о том, как анализировать смещение самостоятельно.

1 голос
/ 22 мая 2017

Следующий код напечатает хорошую дату (местное время) из даты в Твиттере (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'))
0 голосов
/ 22 июня 2019

Первоначальная проблема, с которой я столкнулся, заключалась в конвертации из даты и времени, которые 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').

Затем вы можете использовать эту строку, как описано в других комментариях, чтобы манипулировать ею.

0 голосов
/ 24 мая 2019

Немного стар, но использование синтаксического анализа действительно поможет мне с этой проблемой

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
0 голосов
/ 08 сентября 2018

Как насчет этого? Для этого не нужно форматировать строки.

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

Моя система работает по Гринвичу +2, поэтому разница включена.

0 голосов
/ 25 марта 2018

Используя стратегию, аналогичную предложенной 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...