Gestion du temps

Il est fréquemment nécessaire de mesurer du temps, manipuler des dates et des heures et contrôler temporellement l’exécution d’un programme (interruption, synchronisation, …).

Python est fourni avec trois modules permettant le traiter des grandeurs temporelles : time , datetime et dateutil.

Manipulation des dates, des heures et des durées

Le module time

>>> import time

Dans le module time, le temps est représenté par un nombre unique :

la fonction time()

>>> time.time()
1555251764.2756743

Nombre de secondes écoulées depuis l’origine des temps (informatiques !) , appelée epoch, correspondant au 1er janvier 1970 à 00:00:00 :

>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

la fonction clock()

>>> time.clock()
3.5e-06
>>> time.clock()
5.7108366

Nombre de secondes écoulées depuis le premier appel à cette fonction dans la session Python en cours.

On peut utiliser la fonction clock() , plus précise pour chronométrer le temps d’exécution d’une partie d’un programme par exemple (voir Choses diverses et utiles)

 

Exercice : jeu du métronome
Écrire un petit jeu de métronome : après un petit texte d’explication, l’utilisateur est invité à appuyer sur la touche « Entrée » à intervalle de temps le plus régulier possible (1 seconde)
A chaque appui sur la touche « Entrée », un son « score » est affiché sous la forme suivante :

  • Temps trop court (inférieur à 1 seconde) : ………………..#….|…………………….
  • Temps trop long (supérieur à une seconde) :…………………….|..#………………….

A chaque écart de 1 caractère doit correspondre à un écart de 5 centièmes de seconde.Pour arrêter le jeu, l’utilisateur doit appuyer sur Ctrl+C.

 

La fonction localtime() nous donne la date et l’heure actuelle, sous la forme d’un objet à plusieurs attributs :

>>> now = time.localtime()
>>> now
time.struct_time(tm_year=2019, tm_mon=4, tm_mday=14, tm_hour=16, tm_min=41, tm_sec=14, tm_wday=6, tm_yday=104, tm_isdst=1)
>>> now.tm_mon
4

 

On peut utiliser la fonction sleep() pour interrompre l’exécution d’un programme pendant un certain temps :

>>> time.sleep(1.2) # fait une pause de 1,2 secondes

 

 

Documentation complète : https://docs.python.org/3.5/library/time.html

 

 

 

Le module datetime

Le module datetime permet de manipuler des dates et des heures de façon plus aisée. Deux objets sont particulièrement utiles :

from datetime import datetime, timedelta

# Création d'un objet datetime à une date et heure donnée :
datetime(année, mois, jour, heure, minute, seconde, microseconde, fuseau horaire)

# Création d'un objet datetime à la date et l'heure actuelle :
datetime.now()

L’objet datetime possède les attributs suivants : year , month , day , hour , minute , second

Par exemple si l’on a oublié en quelle année nous sommes, Python peut nous aider :

>>> print(datetime.now().year)

 

Pour travailler sur des durées, on peut utiliser l’objet timedelta :

# Création d'un objet définissant une durée (écart entre deux dates) :
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

On peut facilement obtenir un écart entre deux dates, ainsi si l’on a oublié son age, Python peut là aussi nous aider :

>>> print(datetime.now() - datetime(1972, 10, 26))

 

 

 

Exercice : age du capitaine
Le capitaine est né 3870 h après le 5 février 1999 à midi. Quel était l’age du capitaine (à l’heure près) le 14 juillet 2018 à 8h ? (exprimer cet age en jours et heures)
Exercice : horodatage de fichiers/dossiers
Lorsque l’on souhaite enregistrer des données (capteurs, caméra, …) il est souvent nécessaire d’organiser ces données dans des fichiers (qui sont souvent nombreux), des dossiers et sous-dossiers.
Créer une fonction datetime2str() permettant d’obtenir la date et heure actuelle sous la forme d’une chaîne de caractères au format suivant : aaaa-mm-jj HH:MM:SS
Modifier ensuite cette fonction de sorte qu’elle accepte comme argument facultatif une date au format datetime .
Ce format de texte n’est pas compatible avec les noms de fichiers, qui ne peuvent contenir que des lettres, des chiffres ou bien les deux caractères et _ :
Ajouter une option à cette fonction pour qu’elle puisse également renvoyer une date sont la forme : aaaa-mm-jj_HH-MM-SS

 

Supposons à présent que des capteurs nous fournissent des données, et que nous souhaitions, à intervalle de temps régulier, les enregistrer dans un fichier. Ces données devant être enregistrées sur une longue période de temps, nous adoptons la structure suivante :
  • un dossier par mois, au format : aaaa-mm
  • un fichier par jour, au format : aaaa-mm-jj.csv
  • un enregistrement par minute, chaque ligne au format : aaaa-mm-jj HH:MM:SS, donnée1, donnée2, …
Écrire une fonction creer_dossier(path, now) permettant de créer un dossier « mensuel » au format aaaa-mm, et ne faisant rien s’il existe déjà. La fonction doit renvoyer le chemin du dossier créé s’il existe, None dans le cas contraire.
Pour simuler les capteurs, créons une classe :
from random import random

class Capteur():
    def __init__(self, v0, k):
        self.val = v0
        self.k = k

    def getVal(self):
        self.val += self.k*random()
        return self.val

On peut ainsi instancier plusieurs capteurs « virtuels » :

capteur1 = Capteur(0, 2)
capteur2 = Capteur(10, 5)

 

Écrire une fonction enregistrer_données(path) , appelée par un timer de répétition de période 10 secondes, qui permet de :

  • créer un dossier path/aaaa-mm (sauf s’il existe déjà)
  • lire les données des capteurs « virtuels »
  • générer une ligne de données au format aaaa-mm-jj HH:MM:SS, donnée1, donnée2, …
  • enregistrer cette ligne dans un fichier nommé aaaa-mm-jj.csv
Utiliser une boucle interruptible, sans oublier de mettre stopFlag.set() dans les instructions de terminaison !

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *