2009-02-10 9 views
14

J'ai un fichier texte avec beaucoup de chaînes datetime dans isoformat. Les chaînes sont similaires à ceci:Analyse de chaînes de date-heure avec des microsecondes

'2009-02-10 16: 06: 52.598800'

Ces chaînes ont été générées à l'aide str(datetime_object). Le problème est que, pour une raison quelconque, str(datetime_object) génère un format différent lorsque l'objet datetime a microsecondes à zéro et quelques chaînes se présentent comme suit:

« 2009-02-10 16:06:52 »

Comment puis-je analyser ces chaînes et les convertir en datetime object?

Il est très important d'obtenir toutes les données dans l'objet, y compris les microsecondes.

Je dois utiliser Python 2.5, J'ai trouvé que la directive de format %f pour microsecondes n'existe pas dans 2.5.

Répondre

21

Autre possibilité:

from datetime import datetime 

def str2datetime(s): 
    parts = s.split('.') 
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S") 
    return dt.replace(microsecond=int(parts[1])) 

En utilisant strptime lui-même pour analyser la date/chaîne de temps (donc pas besoin penser à des cas de coin pour une regex).

+0

Merci pour cette réponse! Je suggère de changer la dernière ligne à: retour dt.replace (microsecond = int (1000 * float ('0.' + parties [1]))) cela gère tous les cas correctement, comme par ex. '2017-03-16 21: 20: 57.31' qui devrait donner 310us plutôt que 31us. – denizb

5

Quelqu'un a déjà signalé un problème avec ce problème: Issue 1982. Puisque vous avez besoin de ceci pour travailler avec python 2.5, vous devez analyser la valeur manuellement, puis manipuler l'objet datetime.

2

Il pourrait ne pas être la meilleure solution, mais vous pouvez utiliser une expression régulière:

m = re.match(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d{6}))?', datestr) 
dt = datetime.datetime(*[int(x) for x in m.groups() if x]) 
10

Utilisez le module dateutil. Il supporte une gamme beaucoup plus large de formats de date et d'heure que les formats Python.

Vous aurez besoin de easy_install dateutil pour le code suivant au travail:

from dateutil.parser import parser 

p = parser() 
datetime_with_microseconds = p.parse('2009-02-10 16:06:52.598800') 
print datetime_with_microseconds.microsecond 

résultats dans:

598799 
+0

+1 dateutil tout le chemin – Yarin