Comment puis-je analyser une chaîne de temps contenant des millisecondes avec python?
je suis capable d'analyser les chaînes contenant la date/heure avec heure.strptime
>>> import time
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S')
(2009, 3, 30, 16, 31, 32, 0, 89, -1)
Comment puis-je analyser une chaîne de temps qui contient millisecondes?
>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
data_string[found.end():])
ValueError: unconverted data remains: .123
6 réponses
Python 2.6 a ajouté une nouvelle macro strftime/strptime %f
, qui fait des microsecondes. Pas sûr si cela est documenté nulle part. Mais si vous utilisez 2.6 ou 3.0, vous pouvez le faire:
time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
Edit: Je n'ai jamais vraiment travaillé avec le module time
, donc je ne l'ai pas remarqué au début, mais il semble que le temps.struct_time ne stocke pas réellement les millisecondes / microsecondes. Vous pourriez être mieux en utilisant datetime
, comme ceci:
>>> from datetime import datetime
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
>>> a.microsecond
123000
je sais que c'est une question plus ancienne mais j'utilise toujours Python 2.4.3 et j'avais besoin de trouver une meilleure façon de convertir la chaîne de données en datetime.
la solution si datetime ne supporte pas %f et sans avoir besoin d'un essai / excepté est:
(dt, mSecs) = row[5].strip().split(".")
dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6])
mSeconds = datetime.timedelta(microseconds = int(mSecs))
fullDateTime = dt + mSeconds
cela fonctionne pour la chaîne de saisie"2010-10-06 09:42:52.266000"
pour donner le code que réponse de nstehr se réfère à (de sa source ):
def timeparse(t, format):
"""Parse a time string that might contain fractions of a second.
Fractional seconds are supported using a fragile, miserable hack.
Given a time string like '02:03:04.234234' and a format string of
'%H:%M:%S', time.strptime() will raise a ValueError with this
message: 'unconverted data remains: .234234'. If %S is in the
format string and the ValueError matches as above, a datetime
object will be created from the part that matches and the
microseconds in the time string.
"""
try:
return datetime.datetime(*time.strptime(t, format)[0:6]).time()
except ValueError, msg:
if "%S" in format:
msg = str(msg)
mat = re.match(r"unconverted data remains:"
" \.([0-9]{1,6})$", msg)
if mat is not None:
# fractional seconds are present - this is the style
# used by datetime's isoformat() method
frac = "." + mat.group(1)
t = t[:-len(frac)]
t = datetime.datetime(*time.strptime(t, format)[0:6])
microsecond = int(float(frac)*1e6)
return t.replace(microsecond=microsecond)
else:
mat = re.match(r"unconverted data remains:"
" \,([0-9]{3,3})$", msg)
if mat is not None:
# fractional seconds are present - this is the style
# used by the logging module
frac = "." + mat.group(1)
t = t[:-len(frac)]
t = datetime.datetime(*time.strptime(t, format)[0:6])
microsecond = int(float(frac)*1e6)
return t.replace(microsecond=microsecond)
raise
ma première pensée a été d'essayer de le passer '30/03/09 16:31: 32.123' (avec un point au lieu d'un colon entre les secondes et les millisecondes.) Mais cela ne fonctionne pas. Un rapide coup d'oeil sur le docs indique que les secondes fractionnaires sont ignorées dans tous les cas...
ah, différences de version. C'était signalé comme un bug et maintenant dans 2.6+ vous pouvez utiliser" %S.%f " pour l'analyser.
de python, les listes de diffusion: analyse de la milliseconde fil . Il y a une fonction postée là qui semble obtenir le travail fait, bien que comme mentionné dans les commentaires de l'auteur il est en quelque sorte un piratage. Il utilise des expressions régulières pour gérer l'exception qui est soulevée, puis fait certains calculs.
vous pouvez également essayer de faire les expressions régulières et les calculs à l'avance, avant de passer à strptime.
pour python 2 j'ai fait ceci
print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])
il imprime le temps "%H:%M:%S" , divise le temps.temps () à deux substrats (avant et après le .) xxxxxxx.xx et depuis .xx sont mes millisecondes-je ajouter de la deuxième sous-chaîne à mon "%H:%M:%S"
l'espoir qui a du sens :) Exemple de sortie:
13: 31: 21.72 Blink 01
13: 31:21.81 FIN DU CLIGNEMENT DES YEUX 01
13:31:26.3 Blink 01
13:31:26.39 FIN DU BLINK 01
13:31:34.65 Ligne De Départ 01