Python strptime() et les fuseaux horaires?
J'ai un fichier CSV à partir d'un fichier de vidage Blackberry IPD de sauvegarde, créé à l'aide de IPDDump.
La date/heure de chaînes à regarder ici, quelque chose comme ça
(où EST
est un Australien fuseau horaire):
Tue Jun 22 07:46:22 EST 2010
J'ai besoin d'être en mesure d'analyser cette date en Python. Au début, j'ai essayé d'utiliser le 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, le datetime
objet qui vient en arrière ne semble pas avoir tout tzinfo
associés.
J'ai lu sur cette page qui, apparemment, datetime.strptime
rejette tzinfo
, cependant, j'ai vérifié la documentation, et je ne peux pas trouver quelque chose à cet effet documenté ici.
J'ai été en mesure d'obtenir la date analysée à l'aide d'un tiers bibliothèque Python, dateutil, mais je suis toujours curieux de savoir comment j'ai été en utilisant le construit strptime()
de façon incorrecte? Est-il possible de l' strptime()
de jouer gentiment avec les fuseaux horaires?
- Ne pouvez-vous pas juste... convertir toutes les dates à l'heure GMT?
- Hmm, je l'espérais, mais j'ai été en supposant que strftime/datetime pourrait en quelque sorte de le faire? De toute façon, j'ai besoin de stocker/analyser le fait que le datetimes sont dans l'est de fuseau horaire, ou quel que soit le fuseau horaire qu'ils m'arriver. Le script doit être en mesure d'analyser générique datetimes avec le fuseau horaire de l'info (par exemple, ETC pourrait être un autre fuseau horaire).
- Est également un de NOUS l'abréviation du fuseau horaire. (De la même manière BST est à la fois un royaume-UNI et un Brésilien fuseau horaire abrév.) Ces abréviations sont juste intrinsèquement ambiguë. Utiliser les décalages par rapport à UTC/GMT à la place. (Si vous avez besoin de soutien abréviations, vous avez besoin de faire le mappage de paramètres régionaux dépendant et c'est le fouillis d'un rat-trou.)
- HNE, l'abréviation du fuseau horaire est ambigu. Voir aussi: Analyse de chaîne de date/heure avec le fuseau horaire nom abrégé en Python?
Vous devez vous connecter pour publier un commentaire.
La
datetime
documentation du module dit:Voir que
[0:6]
? Que vous obtient(year, month, day, hour, minute, second)
. Rien d'autre. Aucune mention de fuseaux horaires.Il est intéressant de noter, [Win XP SP2, Python 2.6, 2.7] en passant par votre exemple, à
time.strptime
ne fonctionne pas, mais si vous enlevez le "%Z" et le "EST" il ne le travail. Aussi à l'aide de "UTC" ou "GMT" au lieu de "EST" travaille. "PST" et "MEZ" ne fonctionnent pas. Déroutante.Il est intéressant de noter ce qui a été mis à jour à partir de la version 3.2 et la même documentation indique également les éléments suivants:
Notez que cela ne fonctionne pas avec %Z, de sorte que le cas est important. Voir l'exemple suivant:
Je recommande d'utiliser python-dateutil. Son analyseur a été en mesure d'analyser tous les format de date que j'ai jeté à elle jusqu'à présent.
et ainsi de suite. No dealing avec
strptime()
format de bêtises... il suffit de jeter un jour et il Fait La bonne Chose.Mise À Jour: Oups. J'ai manqué à votre question initiale que vous avez mentionné que vous avez utilisé
dateutil
, désolé. Mais j'espère que cette réponse est encore utile à d'autres gens qui trébuchent à travers cette question lorsqu'ils ont de la date de l'analyse des questions et de voir l'utilité de ce module.>>> 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
peut ne pas représenter ambigu heure locale. Si votre demande ne peut pas tolérer ~1h erreurs, utilisezpytz
à base de solution lorsque l'on travaille avec les fuseaux horaires en Python.dateutil.parser.parse("10-27-2016 09:06 AM PDT")
retourne:datetime.datetime(2016, 10, 27, 9, 6)
ne parvient pas à comprendre fuseau horaire...weirddtstring = '04\Nov\2013:16:19:20+0100'
réussi avecparser.parse(weirddtstring, dayfirst=True, fuzzy=True)
dans le cas où quelqu'un d'autre vient à travers ces plutôt rare entrées...dateutil parser
peut être simple à utiliser, maisstrptime()
est plus rapide. En outre, ses formats sont assez facile à apprendre.Votre temps de chaîne est similaire au format de l'heure en rfc 2822 (format de date dans des e-mails, les en-têtes http). Vous pourriez analyser en utilisant seulement stdlib:
Voir les solutions que le rendement de fuseau horaire-conscient datetime objets pour les différentes versions de Python: l'analyse de la date avec le fuseau horaire à partir d'un e-mail.
Dans ce format,
HNE
est sémantiquement équivalent à-0500
. Même si, en général, une abréviation du fuseau horaire n'est pas assez, pour identifier un fuseau horaire unique.