Je reçois des messages Twitter envoyés à une certaine date dans le format suivant à partir de Twitter:
Tue Mar 29 08:11:25 +0000 2011
Je souhaite stocker ces dates dans le champ 'horodatage avec fuseau horaire' dans postgresql avec le champ DateTimeField de djangos. Quand je stocke cette chaîne, cependant, j'obtiens cette erreur:
ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']
puis-je transformer automatiquement le type de données Twitter en une heure de date et heure python (qui fonctionne ailleurs dans mon application pour l'enregistrement des dates).
Écrire quelque chose comme ceci devrait convertir une date Twitter en un horodatage.
import time
ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(Tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
Essayez ceci. Il suppose que le format de date de Twitter est conforme à la RFC822 (voir la question liée à @Adrien).
Un objet datetime naïf est construit (c'est-à-dire, aucune information de fuseau horaire). Il est ajusté en fonction du décalage horaire vers UTC. Sauf si vous avez besoin de conserver le fuseau horaire d'origine, je stocke l'heure de la date au format UTC et la formate en heure locale lorsque vous l'affichez.
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])
vous pouvez convertir la date en utilisant datetime.strptime()
ou time.strptime()
. toutefois, ces deux fonctions ne peuvent pas analyser le décalage du fuseau horaire (voir ce bogue ).
donc, la seule solution que je vois est de scinder la date vous-même, de supprimer le décalage de fuseau horaire, d'alimenter le reste en strptime()
et de traiter le décalage manuellement ...
jetez un oeil à cette question , où vous trouverez quelques astuces pour analyser vous-même le décalage.
Le code suivant imprimera une date de Nice (heure locale) à partir d'une date 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'))
En utilisant une stratégie similaire à celle proposée par SoFolichon, vous pouvez également utiliser pytz
comme suit dans Python 3.x:
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')
Que dis-tu de ça? Il n'a pas besoin de chaînes de formatage.
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
Mon système est à GMT +2 d'où la différence incluse.