TD G2 : Modules time et datetime¶
1. Module time¶
On va commencer par travailler avec le module timeque l'on a va utiliser ici pour chronométrer des fonctions.
Q1. Compléter la cellule ci-dessous pour afficher la liste des fonctions de ce module.
import time
dir(time)
['CLOCK_BOOTTIME', 'CLOCK_MONOTONIC', 'CLOCK_MONOTONIC_RAW', 'CLOCK_PROCESS_CPUTIME_ID', 'CLOCK_REALTIME', 'CLOCK_TAI', 'CLOCK_THREAD_CPUTIME_ID', '_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock_getres', 'clock_gettime', 'clock_gettime_ns', 'clock_settime', 'clock_settime_ns', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'pthread_getcpuclockid', 'sleep', 'strftime', 'strptime', 'struct_time', 'thread_time', 'thread_time_ns', 'time', 'time_ns', 'timezone', 'tzname', 'tzset']
On peut voir dans la liste précédente qu'il existe une fonction time().
Q2. Faire afficher l'aide sur cette fonction et essayer de comprendre ce qu'elle fait.
help(time.time)
Help on built-in function time in module time:
time(...)
time() -> floating point number
Return the current time in seconds since the Epoch.
Fractions of a second may be present if the system clock provides them.
En clair, cette fonction time() renvoie le nombre de secondes depuis une date de référence (cette date s'appelle epoch, et représente en principe le 1er janvier 1970, 0h0'0"). Voici un exemple d'utilisation :
Q3. Exécuter plusieurs fois la cellule suivante et constanter les changements au cours du temps
t0 = time.time()
print(t0)
print(type(t0))
1733308334.4094834 <class 'float'>
Le principe pour chronométrer le temps d'exécution d'une fonction :
En mesurant l'heure avant et après l'exécution d'une fonction, on peut chronométrer la durée de son exécution :
t0= time.time()
for i in range(100000):
a = i**2 # on effectue une opération
t1= time.time()
print(f"Durée = {t1-t0:.4f} secondes") # :.4f signifie affiche 4 décimales
Durée = 0.0108 secondes
Remarquons que t1-t0 représente une durée, et que si l'on veut la convertir en minutes secondes etc., il faudra faire nos propres conversions...
Q4. Exécuter plusieurs fois la cellule précédente pour voir si le temps d'exécution est exactement le même. On devrait constater que non, cela est du au fait qu'en arrière plan, de nombreuses tâches liées au système sont exécutées et consommes elles aussi du temps. Mais pour une première estimation, cela ne posera pas de problème.
2. Module datetime¶
Voyons maintenant le module datetime qui propose beaucoup d'autres fonctionnalités (gestions des dates, des temps etc.) au travers de quelques exemples.
a. Gestion des dates¶
Q5. Compléter le code suivant pour faire afficher la liste des fonction du module datetime
import datetime
dir(datetime)
['MAXYEAR', 'MINYEAR', 'UTC', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'timezone', 'tzinfo']
Dans le module datetime on trouve par exemple la fonction datetime qui permet de saisir une date (il faut bien l'écrire deux fois !). Elle renvoie un objet de type datetime.datetime (c'est pas simple tous ces mots !).
Ensuite, on peut convertir l'objet précédent en chaine de caractère avec la méthode .strftime(...). Voyons cela sur un exemple en retrouvant par exemple le jour de la naissance de Kylian Mbappe:
# syntaxe pour la saisie d'une date :
day0 = datetime.datetime(1998,12,20)
print("type :",type(day0))
# Conversion de l'objet date en str :
print("Kylian est né un",day0.strftime("%A"))
type : <class 'datetime.datetime'> Kylian est né un Sunday
Q6. Pour un aperçu complet des possibilités d'affichage de la fonction strftime(...) (ici on a par exemple utilisé l'option %A) on peut par exemple consulter cette page du site W3School. Déterminer alors par exmple le numéro du jour (entre 1 et 365) de la naissance de Kylian.
num_jour = day0.strftime("%j")
print("Kylian est né le",num_jour,"e jour de l'année")
Kylian est né le 354 e jour de l'année
Q7. Si D est un objet de type datetime.datetime on peut avoir accès à l'année en tapant D.year. Récupérons alors la date d'aujourd'hui (voir sur W3school) et calculer l'âge de Kylian en effectuant la soustraction :
today = datetime.datetime.now()
print(f"L'âge de Kylian est de {today.year-day0.year} ans")
L'âge de Kylian est de 26 ans
On peut être plus précis car python sait avec ce module faire des soustractions de dates.
delta = today - day0
print("type de today :",type(today))
print("type de delta :", type(delta)) # on remarque que le type est différent de datetime
print("Kylian est né en ",day0.year)
print("Nous sommes en ",today.year)
print("Il a ",today.year-day0.year,"ans")
print("Plus précisément, il s'est écoulé :",delta)
print("Il est né il y a ",delta.days,"jours")
type de today : <class 'datetime.datetime'> type de delta : <class 'datetime.timedelta'> Kylian est né en 1998 Nous sommes en 2024 Il a 26 ans Plus précisément, il s'est écoulé : 9481 days, 11:38:06.031338 Il est né il y a 9481 jours
Remarque : on notera que la variable delta est d'un type timedelta et non pas datetime.
Exercice 1
Pour la fin de l'année scolaire 2024-2025, on espère ne pas déborder en juillet. Quel sera le dernier jour de cours ?
Q8. Quel jour est-ce ?
sortie = datetime.datetime(2025,6,30)
print(sortie.strftime("%A %d %B %Y"))
Monday 30 June 2025
Q9. Combien reste-il de jours ? Combien de semaines ?
today =datetime.datetime.now()
fin = datetime.datetime(2025,6,30)
temps = fin - today
print("il reste :",temps)
il reste : 207 days, 12:17:36.108636
Exercice 2
Q10. L'algorithme suivant permet de retrouver la date du 4e vendredi de février. Bien comprendre cet algorithme puis le modifier pour retrouver la date du passage à l'heure d'été, sachant que ce sera le dernier dimanche de mars.
print("Les vendredis de février sont :")
for i in range(1,29):
date = datetime.datetime(2025,2,i)
day = date.strftime('%A')
if day == 'Friday' :
print(f"vendredi {i} février 2024")
sortie = i
print("Le 4e vendredi est le",sortie,"février 2023")
Les vendredis de février sont : vendredi 7 février 2024 vendredi 14 février 2024 vendredi 21 février 2024 vendredi 28 février 2024 Le 4e vendredi est le 28 février 2023
b. Gestion des durées¶
Un objet de type timedeltareprésente une durée. On peut accéder au nombres de jours et aux nombres de secondes. Voyons sur un exemple de ce que l'on peut faire
Voyons le temps qui nous spérare de l'ouverture de vos cadeaux de Noël
christmas = datetime.datetime(2024,12,25,0,0,0)
today = datetime.datetime.now()
delta = christmas-today
print(delta)
20 days, 12:07:23.210168
On peut directement exprimer cette durée en jours et secondes (et c'est "malheureusment" tout. Pour le reste il faudra faire ses propres calculs !)
print("Il reste ",delta.total_seconds(),"secondes")
print("Il reste ",delta.days,"jours")
Il reste 1771643.210168 secondes Il reste 20 jours
Si l'on veut convertir cela en semaines, ou en heures ou en minutes on peut procéder ainsi
minute = datetime.timedelta(minutes=1) # durée d'une minute
hour = datetime.timedelta(hours=1) # durée d'un heure
week = datetime.timedelta(weeks=1) # durée d'un semaine
print("en semaines ",delta/week)
print("en heures ",delta/hour)
print("en minutes ",delta/minute)
en semaines 2.929304249616402 en heures 492.1231139355556 en minutes 29527.386836133333
Pour finir, si l'on veut saisir une durée en heures ,minutes par exemple on peut écrire
elapsetime = datetime.timedelta(hours=2,minutes=10)
print(elapsetime)
2:10:00
et le traduire en secondes
second = datetime.timedelta(seconds=1)
print(elapsetime/second)
7800.0
Exercice 3
Q11. Écrire un code qui donne :
- le jour de la semaine de votre naissance
- votre âge en jours
- votre âge en minutes !