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
158
demandé sur Martin Thoma 2009-03-30 21:36:53

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
248
répondu DNS 2011-08-02 07:59:09

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"

12
répondu Andrew Stern 2010-10-12 15:09:19

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
3
répondu Phil H 2017-05-23 11:55:01

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.

1
répondu MarkusQ 2009-03-30 17:50:51

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.

1
répondu nstehr 2013-01-12 16:51:09

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


1
répondu Papatrexas 2014-11-01 13:36:53