J'ai un fichier de vidage CSV à partir d'une sauvegarde Blackberry IPD, créé à l'aide d'IPDDump. Les chaînes de date / heure ici ressemblent à ceci (où EST
est un fuseau horaire australien):
Tue Jun 22 07:46:22 EST 2010
J'ai besoin de pouvoir analyser cette date en Python. Au début, j'ai essayé d'utiliser la strptime()
fonction de datettime.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Cependant, pour une raison quelconque, l' datetime
objet qui revient ne semble en avoir aucun tzinfo
associé.
J'ai lu sur cette page qui apparemment se datetime.strptime
défait en silence tzinfo
, cependant, j'ai vérifié la documentation, et je ne trouve rien à cet effet documenté ici .
J'ai pu obtenir la date analysée à l'aide d'une bibliothèque Python tierce, dateutil , mais je suis toujours curieux de savoir comment j'utilisais strptime()
incorrectement le intégré ? Existe-t-il un moyen strptime()
de jouer correctement avec les fuseaux horaires?
Réponses:
La
datetime
documentation du module dit:Vous voyez ça
[0:6]
? Cela vous obtient(year, month, day, hour, minute, second)
. Rien d'autre. Aucune mention des fuseaux horaires.Fait intéressant, [Win XP SP2, Python 2.6, 2.7] transmettre votre exemple à
time.strptime
ne fonctionne pas, mais si vous supprimez le "% Z" et le "EST", cela fonctionne. Utiliser également "UTC" ou "GMT" au lieu de "EST" fonctionne. "PST" et "MEZ" ne fonctionnent pas. Déroutant.Il convient de noter que cela a été mis à jour à partir de la version 3.2 et que la même documentation indique désormais également ce qui suit:
Notez que cela ne fonctionne pas avec% Z, donc le cas est important. Consultez l'exemple suivant:
la source
Je recommande d'utiliser python-dateutil . Son analyseur a été en mesure d'analyser tous les formats de date que je lui ai lancés jusqu'à présent.
etc. Pas de problème de
strptime()
format ... il suffit de lui donner une date et il fait la bonne chose.Mise à jour : Oups. J'ai manqué dans votre question initiale que vous avez mentionnée que vous avez utilisée
dateutil
, désolé pour cela. Mais j'espère que cette réponse sera toujours utile à d'autres personnes qui tombent sur cette question lorsqu'elles ont des questions d'analyse de date et voient l'utilité de ce module.la source
>>> parser.parse("Thu, 25 Sep 2003 10:49:41,123 -0300") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 748, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 310, in parse res, skipped_tokens = self._parse(timestr, **kwargs) TypeError: 'NoneType' object is not iterable
parser.parse("Thu, 25 Sep 2003 10:49:41.123 -0300") returns: datetime.datetime(2003, 9, 25, 10, 49, 41, 123000, tzinfo=tzoffset(None, -10800))
dateutil.parser.parse("10-27-2016 09:06 AM PDT")
renvoie:datetime.datetime(2016, 10, 27, 9, 6)
ne parvient pas à déterminer le fuseau horaire ...dateutil parser
peut être simple à utiliser, maisstrptime()
est plus rapide. De plus, ses formats sont assez faciles à apprendre.Votre chaîne d'heure est similaire au format d'heure dans rfc 2822 (format de date dans l'e-mail, en-têtes http) . Vous pouvez l'analyser en utilisant uniquement stdlib:
Découvrez les solutions qui génèrent des objets datetime tenant compte du fuseau horaire pour différentes versions de Python: analyse de la date avec le fuseau horaire d'un e-mail .
Dans ce format,
EST
est sémantiquement équivalent à-0500
. Cependant, en général, une abréviation de fuseau horaire ne suffit pas pour identifier un fuseau horaire de manière unique .la source
Ran dans ce problème exact.
Ce que j'ai fini par faire:
la source