Otrzymuję wiadomości na Twitterze, które są wysyłane w określonej dacie w następnym formacie z Twittera:

Tue Mar 29 08:11:25 +0000 2011

Chcę przechowywać te daty w "znaczniku czasu z polem strefy czasowej" w PostgreSQL z polem Djangos DateTimefield. Kiedy przechowuję ten ciąg, jednak otrzymuję ten błąd:

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

Czy mogę automatycznie przekształcić DateTeTeTyp Twittera na czas Datetime Python (który działa w innym miejscu w mojej aplikacji do oszczędzania dat).

48
Javaaaa 9 październik 2011, 17:37

9 odpowiedzi

Najlepsza odpowiedź

Pisanie czegoś takiego powinno przekonwertować datę Twittera do znacznika.

import time

ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
80
Angus Tay 17 czerwiec 2020, 17:07

Korzystając z podobnej strategii jako proponowanej sofolichon, w Pythonie 3.x można również użyć pytz jak:

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')
0
1man 11 kwiecień 2018, 14:52

Co powiesz na to? Nie potrzebuje żadnych sznurów formatowania.

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

Mój system znajduje się w GMT +2 stąd różnica.

0
MikeCPT 8 wrzesień 2018, 11:20

Daj to. Zakłada, że format daty z Twittera jest zgodny z RFC822 (patrz pytanie związane z @adrien).

Zbudowany jest naiwny obiekt datetime (tj. Brak informacji o strefie czasowej). Jest regulowany zgodnie z Offsetem TimeZone do UTC. Chyba że masz potrzebę zachowania oryginalnego czasu, przechowywałbym czas daty jako UTC i format w lokalnym czasie, gdy go wyświetlisz.

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])
15
Rob Cowie 9 październik 2011, 14:39

Trochę stary, ale za pomocą Parse naprawdę pomogą mi z tym problemem

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
7
StriderKeni 24 maj 2019, 00:07

Aby uzyskać datetime z strefą czasową Możesz proste użycie datetime.strptime jak następuje:

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
3
laynusfloyd 6 czerwiec 2019, 13:56

Możesz konwertować datę za pomocą datetime.strptime() lub time.strptime(). Jednak te dwie funkcje nie mogą przenikać offsetu czasowego (patrz Ten błąd).

Tak więc, jedynym rozwiązaniem, które widzę, jest podzielenie daty siebie, usuń przesunięcie strefy czasu, podaj resztę do strptime() i przetworzyć przesunięcie ręcznie ...

Spójrz na To pytanie, gdzie znajdziesz jakieś wskazówki, jak przewidzieć samotność.

2
Community 23 maj 2017, 11:55

Poniższy kod wydrukuje ładną datę (czas lokalny) z daty 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'))
1
SoFolichon 22 maj 2017, 16:03

Początkowym problemem, który miałem konwertowanie z datetime, że API Twittera daje ciąg.

Następujące prace, które dotyczą różnych komentarzy, ludzie wydają się mieć na powyższe rozwiązania, które są niewielki niejasne, czy data rozpoczęcia jest już w formacie strunowym, czy nie. Działa to dla Pythona 2.7

Z tweetem z interfejsu API Tweet.Created_at daje datę w formacie DateTime. Na górze twojego pliku, dodaj from datetime import datetime

Następnie użyj poniższych, aby uzyskać odpowiedni ciąg.

datetime.strftime(tweet.created_at,'%a %b %d %H:%M:%S %z %Y').

Następnie możesz użyć tego ciągu, jak opisano w innych komentarzach, aby go manipulować.

1
Bob Aleena 22 czerwiec 2019, 19:24