web-dev-qa-db-fra.com

Analyser la chaîne de temps dans Python

J'ai une chaîne de date-heure que je ne sais pas comment l'analyser en Python.

La chaîne est comme ceci:

Tue May 08 15:14:45 +0800 2012

J'ai essayé

datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y")

mais Python augmente

'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y'

Selon Python doc:

% z Décalage UTC sous la forme + HHMM ou -HHMM (chaîne vide si l'objet est naïf).

Quel est le bon format pour analyser cette chaîne de temps?

46
xiaohan2012

datetime.datetime.strptime a des problèmes avec l'analyse du fuseau horaire. Jetez un œil au paquet dateutil :

>>> from dateutil import parser
>>> parser.parse("Tue May 08 15:14:45 +0800 2012")
datetime.datetime(2012, 5, 8, 15, 14, 45, tzinfo=tzoffset(None, 28800))
80
eumiro

Votre meilleur pari est de jeter un œil à strptime()

Quelque chose dans le sens de

>>> from datetime import datetime
>>> date_str = 'Tue May 08 15:14:45 +0800 2012'
>>> date = datetime.strptime(date_str, '%a %B %d %H:%M:%S +0800 %Y')
>>> date
datetime.datetime(2012, 5, 8, 15, 14, 45)

Je ne sais pas comment faire le fuseau horaire +0800 malheureusement, peut-être que quelqu'un d'autre peut aider avec ça.

Les chaînes de formatage peuvent être trouvées à http://docs.python.org/library/time.html#time.strftime et sont les mêmes pour le formatage de la chaîne pour l'impression.

J'espère que ça t'as aidé

Marque

PS, votre meilleur pari pour les fuseaux horaires dans l'installation de pytz à partir de pypi. ( http://pytz.sourceforge.net/ ) en fait, je pense que pytz a une excellente méthode d'analyse datetime si je me souviens bien. La bibliothèque standard est un peu mince au sol avec une fonctionnalité de fuseau horaire.

22
Mark Lakewood

Voici une solution stdlib qui prend en charge un décalage utc variable dans la chaîne de temps d'entrée:

>>> from email.utils import parsedate_tz, mktime_tz
>>> from datetime import datetime, timedelta
>>> timestamp = mktime_tz(parsedate_tz('Tue May 08 15:14:45 +0800 2012'))
>>> utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
>>> utc_time
datetime.datetime(2012, 5, 8, 7, 14, 45)
3
jfs

Il a été discuté à plusieurs reprises dans SO. En bref, "% z" n'est pas pris en charge car la plateforme ne le prend pas en charge. Ma solution est nouvelle, il suffit de sauter le fuseau horaire .:

    datetime.datetime.strptime(re.sub(r"[+-]([0-9])+", "", "Tue May 08 15:14:45 +0800 2012"),"%a %b %d %H:%M:%S %Y")
3
wuliang
In [117]: datetime.datetime.strptime?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in method strptime of type object at 0x9a2520>
Namespace:      Interactive
Docstring:
    string, format -> new datetime parsed from a string (like time.strptime()).
1
JosefAssad