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.

In [1]:
import time

dir(time)
Out[1]:
['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.

In [5]:
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

In [7]:
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 :

In [12]:
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

In [13]:
import datetime

dir(datetime)
Out[13]:
['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:

In [14]:
# 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.

In [16]:
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 :

In [19]:
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.

In [22]:
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 ?

In [24]:
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 ?

In [25]:
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.

In [29]:
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

In [34]:
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 !)

In [35]:
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

In [36]:
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

In [38]:
elapsetime = datetime.timedelta(hours=2,minutes=10)
print(elapsetime)
2:10:00

et le traduire en secondes

In [39]:
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 !