web-dev-qa-db-fra.com

Analyser des horodatages avec un remplissage non nul en Python

Je veux obtenir des dates/heures à partir d'horodatages tels que: 3/1/2014 9:55 avec datetime.strptime, ou quelque chose d'équivalent.

Le mois, le jour du mois et l'heure ne sont pas remplis de zéros, mais il ne semble pas y avoir de directive de mise en forme répertoriée ici capable de l'analyser automatiquement.

Quelle est la meilleure approche pour le faire? Merci!

54
Pythontology

strptime est capable d'analyser des valeurs non complétées. Le fait qu'ils soient marqués comme étant remplis dans la table des codes de formatage s'applique à la sortie de strftime. Donc vous pouvez simplement utiliser

datetime.strptime(datestr, "%m/%d/%Y %H:%M")
94
Jason S

strptime isdo ne nécessite pas de valeur complétée par 0. Voir exemple ci-dessous

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)
4
gaw

Juste au cas où cette réponse aiderait quelqu'un d'autre - je suis venu ici en pensant que j'avais un problème avec le remplissage à zéro, mais c'était en réalité à voir avec 12:00 vs 00:00 et le formateur %I.

Le formateur %I est conçu pour correspondre aux heures d’horloge, éventuellement remplies de zéros. Mais selon votre source de données, vous pouvez obtenir des données indiquant que minuit ou midi est en réalité zéro, par exemple:

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'

Ce que strptime souhaitait réellement était un 12 et non un zéro:

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)

Mais nous ne contrôlons pas toujours nos sources de données! Ma solution pour ce cas Edge consistait à intercepter l'exception en essayant de l'analyser avec un %H, en vérifiant rapidement que nous nous trouvions dans le cas Edge dans lequel nous pensons être.

def get_datetime(string):
    try:
        timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
    except ValueError:
        # someone used zero for midnight?
        timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
        assert string.lower().endswith('am')
        assert timestamp.hour == 0
    return timestamp
2
hwjp

La méthode sans modèle utilise le module dateutil.parse, elle permet d'analyser les formats de date courants, même si vous ne savez pas ce qu'elle utilise actuellement
Ex:

>>> import dateutil.parser
>>> 
>>> utc_time     = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale  = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)
1
xecgr

Vous pouvez voir le document strftime ici , mais en fait ils ne fonctionnent pas tous sur toutes les plateformes , par exemple %-d,%-m ne fonctionne pas sur win7 de python 2.7 afin que vous puissiez accomplir de la sorte

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())  
>>> print(date_str)
2016-5-23
0
黄东辉