Sérialiser et parser une date en Python: formats de strftime/strptime et timestamps


Ça fait 10 ans que j’en fais, et je ne me souviens jamais des lettres à utiliser pour les formats. Pourtant j’utilise tout le temps le même format: celui de MySQL et JSON par défaut, avec en plus les microsecondes, car l’ordre alphanumérique de ce format est le même que l’ordre chronologique, ce qui rend son traitement facile.

Je le met ici pour l’avoir toujours sous la main. Marre de chercher si truc est en minuscule, et machin en majuscule. Je me fais baiser à chaque fois.

Sérialiser une date pour avoir: année, mois, jour, heure, minute, seconde, microseconde :

>>> import datetime
>>> datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
>>> '2012-07-22 16:19:00.539570'

A l’inverse, parser une date:

>>> datetime.datetime.strptime('2012-07-22 16:19:00.539570', '%Y-%m-%d %H:%M:%S.%f')
>>> datetime.datetime(2012, 7, 22, 16, 19, 0, 539570)

Tous les formats sont listés ici.

Et tant qu’on y est, le snippet de manipulation de timestamp (qui pour le fun, n’est pas par défaut dans le module datetime):

>>> import calendar
>>> calendar.timegm(d.utctimetuple()) # d'un objet date vers un timestamp
>>> 1342973940
>>> datetime.datetime.fromtimestamp(1342973940) # et l'inverse
>>> datetime.datetime(2012, 7, 22, 18, 19)

Le timestamp est un timestamp basé sur une epoch of 1970 et un format POSIX, avec toute ce que ça implique, et notamment le fait qu’on perd les microsecondes.

9 thoughts on “Sérialiser et parser une date en Python: formats de strftime/strptime et timestamps

  • Sam Post author

    Pour le gars qui a cherché:

    python date hier

    >>> import datetime
    >>> print datetime.datetime.now() - datetime.timedelta(1)
    2012-08-01 13:51:06.508446
  • François

    Il y a un namespace incorrect :
    datetime.strptime('2012-07-22 16:19:00.539570', '%Y-%m-%d %H:%M:%S.%f')

  • Billou

    Concernant la conversion timestamp/date/timestamp :

    calendar.timegm(d.utctimetuple())
    => cela fournit un timestamp en UTC (sans flottant)

    datetime.datetime.fromtimestamp(1342973940)
    => cela fournit une date LOCAL

    Si l’on veut fournir une date en UTC, mieux vaut faire :
    datetime.datetime.utcfromtimestamp(1342973940)

  • herve

    Bonjour, J’ai un format de date “Lundi 25 Septembre 2014” que j’aimerai sérialiser au format ISO 8601 “2014-09-25” mais mon code ne marche pas:

    valeur = ‘Lundi 25 Septembre 2014’
    valeur = datetime.strptime(valeur, ‘%A %d %B %Y %H:%M’)
    valeur = datetime.strftime(valeur ,’%Y-%m-%d’)

    par contre lorsque valeur = “Monday 25 september 2014′ tout fonctionne nickel. Le soucis vient de la langue quelqu’un aurait-il une idée pour m’aider à convertir les dates en français ?

    • Sam Post author

      Hello,

      Pour les demandes d’aide, un forum est plus approprié qu’un blog.

  • Drife

    Un article très bien foutu comme d’hab.

    Pas mal de fautes par contre, qui nuisent à la crédibilité du propos (c’est dommage !).

    Même si l’article est vieux, ça vaut le coup de corriger ?

    MySQl -> MySQL

    odre -> ordre

    marchin -> machin

    seconde, microsecondes -> seconde, microseconde

    on perd les microseconde -> on perd les microsecondes

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.