it-swarm.com.de

Gehen Sie vom Twitter-Datum zum Python-Datum

Ich erhalte Twitter-Nachrichten, die zu einem bestimmten Zeitpunkt im folgenden Format von Twitter gesendet werden:

Tue Mar 29 08:11:25 +0000 2011

Ich möchte diese Datumsangaben im Feld 'Zeitstempel mit Zeitzone' in Postgresql mit dem Feld 'DateTimeField' von Djangos speichern. Wenn ich diese Zeichenfolge speichere, erhalte ich diesen Fehler:

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

kann ich den Twitter-Datentyp automatisch in eine Python-Datetime-Zeit umwandeln (die an anderer Stelle in meiner App zum Speichern von Daten funktioniert).

34
Javaaaa

Wenn Sie so etwas schreiben, sollte ein Twitter-Datum in einen Zeitstempel umgewandelt werden.

import time

ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(Tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
56
Chris Herring

Lass es versuchen. Es wird davon ausgegangen, dass das Datumsformat von Twitter RFC822-kompatibel ist (siehe die von @Adrien verknüpfte Frage).

Ein naives datetime-Objekt wird erstellt (d. H. Keine Zeitzoneninformation). Sie wird entsprechend dem Zeitzonenversatz zu UTC angepasst. Wenn Sie nicht die ursprüngliche Zeitzone beibehalten müssen, würde ich das Datum als UTC speichern und bei der Anzeige als Ortszeit formatieren.

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])
12
Rob Cowie

Um datetime mit der Zeitzone zu erhalten, können Sie datetime.strptime wie folgt verwenden:

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
laynusfloyd

sie können das Datum mit datetime.strptime() oder time.strptime() umrechnen. Diese beiden Funktionen können jedoch den Zeitzonen-Offset nicht analysieren (siehe diesen Fehler ).

daher ist die einzige Lösung, die ich sehe, das Datum selbst aufzuteilen, den Zeitzonen-Offset zu entfernen, den Rest an strptime() zu übergeben und den Offset manuell zu verarbeiten ...

werfen Sie einen Blick auf diese Frage , wo Sie einige Hinweise finden, wie Sie den Offset selbst analysieren können.

2
Adrien Plisson

Ein bisschen alt, aber die Verwendung von parse hilft mir wirklich bei diesem Problem

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
1
StriderKeni

Mit dem folgenden Code wird ein Nice-Datum (Ortszeit) von einem Twitter-Datum (UTC) gedruckt.

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

Mit einer ähnlichen Strategie wie von SoFolichon vorgeschlagen, können Sie in Python 3.x auch pytz wie folgt verwenden:

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

Wie wäre es damit? Es sind keine Formatierungszeichenfolgen erforderlich.

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

Mein System ist bei GMT +2, daher ist der Unterschied enthalten.

0
MikeCPT

Das anfängliche Problem, das ich hatte, war das Konvertieren von der Datumszeit, die die Twitter-API String gibt.

Die folgenden Arbeiten befassen sich mit unterschiedlichen Kommentaren zu den oben genannten Lösungen, bei denen es nicht ganz klar ist, ob das Startdatum bereits im Zeichenfolgenformat vorliegt oder nicht. Dies funktioniert für Python 2.7

Mit einem Tweet aus der API gibt Tweet.created_at das Datum im Datums-/Uhrzeitformat an. Fügen Sie oben in Ihrer Datei from datetime import datetime

verwenden Sie dann Folgendes, um die entsprechende Zeichenfolge abzurufen.

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

Sie können diese Zeichenfolge dann wie in anderen Kommentaren beschrieben verwenden, um sie zu bearbeiten.

0
Bob Aleena