Les dates#
Dans la partie précédente, nous avons présenté les types de base du langage Python et les opérateurs associés aux types numériques.
Lorsque l’on souhaite manipuler des dates et des heures, on devra avoir recours à un autre type de données, défini dans le module datetime
.
Pour cela, il faudra commencer par charger ce module en ajoutant l’instruction :
import datetime
en en-tête de votre script Python.
Pour créer une nouvelle variable de ce type, on utilisera la syntaxe :
d = datetime.datetime(annee, mois, jour, heure, minutes)
La syntaxe datetime.datetime
, qui peut vous sembler bizarre au premier coup d’oeil signifie à l’interpréteur Python qu’il doit chercher dans le module datetime
une fonction dont le nom est datetime
et l’appeler.
En fait, on pourrait rajouter lors de l’appel de datetime.datetime
un argument pour spécifier les secondes, puis éventuellement un autre pour les microsecondes, si l’on avait besoin d’une heure plus précise.
Si, au contraire, on ne spécifie pas l’heure lors de l’appel de la fonction, l’heure 00h00
sera choisie par défaut.
Par exemple :
import datetime # Cette commande doit se trouver en début de fichier
# [...] (ici, du code concernant autre chose si besoin)
d = datetime.datetime(2020, 8, 27, 17, 23)
print(d)
2020-08-27 17:23:00
d = datetime.datetime(2020, 8, 27, 17, 23, 32)
print(d)
2020-08-27 17:23:32
d = datetime.datetime(2020, 8, 27)
print(d)
2020-08-27 00:00:00
Les opérateurs de comparaison vus au chapitre précédent (<
, >
, <=
, >=
, ==
, !=
) fonctionnent de manière naturelle avec ce type de données :
d1 = datetime.datetime(2020, 8, 27, 17, 23)
d2 = datetime.datetime(2020, 8, 27, 17, 28)
d3 = datetime.datetime(2020, 8, 27, 17, 23)
print(d1 < d2)
True
print(d1 == d3)
True
print(d1 > d3)
False
Il existe d’autres moyens de construire des variables de type date.
On peut générer une date correspondant à l’heure actuelle avec la fonction datetime.now
du module datetime
:
date_actuelle = datetime.datetime.now()
Transformation d’une date en chaîne de caractères#
Si l’on souhaite transformer une date en chaîne de caractères (par exemple pour l’afficher), on peut lui appliquer la fonction str
:
print(str(datetime.datetime(2020, 8, 27)))
2020-08-27 00:00:00
Dans ce cas, on ne peut pas gérer la façon dont se fait cette transformation.
Pour contourner cette limitation, il convient alors d’utiliser strftime
:
d1 = datetime.datetime(...)
s = d1.strftime(format)
L’attribut format
que l’on passe à cette fonction va servir à définir comment on souhaite représenter la date en question.
Il s’agit d’une chaîne de caractères qui pourra contenir les éléments suivants :
Code |
Signification |
---|---|
|
Année |
|
Mois |
|
Jour |
|
Heure |
|
Minutes |
Remarquez que la casse n’est pas neutre pour les codes à utiliser : %M
et %m
ont des significations tout à fait différentes.
Notez également qu’il existe d’autres codes permettant de générer des chaînes de caractères plus variées encore.
Une liste de ces codes est disponible sur la page d’aide du module datetime
.
Vous pouvez vous référer aux exemples ci-dessous pour mieux comprendre le fonctionnement de la fonction strftime
:
d = datetime.datetime(2020, 8, 27, 17, 23)
print(d.strftime("%d-%m-%Y, %H:%M"))
27-08-2020, 17:23
print(d.strftime("%d-%m-%Y"))
27-08-2020
print(d.strftime("%H:%M"))
17:23
print(d.strftime("%d/%m/%Y %Hh%M"))
27/08/2020 17h23
Il est également possible d’effectuer l’opération inverse (lire une date contenue dans une chaîne de caractères, étant donné un format connu).
Cela se fait avec la fonction datetime.strptime
:
d1 = datetime.datetime.strptime(chaine_a_lire, format)
Voici deux exemples d’utilisation de cette fonction :
d1 = datetime.datetime.strptime("2020/8/27, 17:23", "%Y/%m/%d, %H:%M")
print(d1)
2020-08-27 17:23:00
d2 = datetime.datetime.strptime("27-08-2020", "%d-%m-%Y")
print(d2)
2020-08-27 00:00:00
Attributs des objets datetime
#
Lorsque l’on définit une date de type datetime.datetime
, on peut accéder à certains de ses attributs directement :
d1 = datetime.datetime.strptime("2020/8/27, 17:23", "%Y/%m/%d, %H:%M")
print(d1)
2020-08-27 17:23:00
print(d1.year)
2020
print(d1.month)
8
print(d1.day)
27
print(d1.hour)
17
print(d1.minute)
23
print(d1.second)
0
Calcul de temps écoulé#
On peut ensuite souhaiter calculer la différence entre deux dates.
Le résultat de cette opération est une durée, représentée en Python par le type timedelta
(lui aussi défini dans le module datetime
).
d1 = datetime.datetime(2020, 8, 27, 17, 23)
d2 = datetime.datetime(2020, 8, 27, 17, 28)
intervalle_de_temps = d1 - d2
print(type(intervalle_de_temps))
<class 'datetime.timedelta'>
Une autre façon de créer une durée au format timedelta
est d’utiliser la fonction du même nom :
duree = datetime.timedelta(weeks=0, days=10, hours=3, minutes=10, seconds=23)
print(duree)
10 days, 3:10:23
Très souvent, il est utile pour manipuler une durée de la convertir en un nombre de secondes et de manipuler ce nombre ensuite. Cela se fait à l’aide de la commande :
d1 = datetime.datetime(2020, 8, 27, 17, 23)
d2 = datetime.datetime(2020, 8, 27, 17, 28)
intervalle_de_temps = d1 - d2
print(intervalle_de_temps.total_seconds())
-300.0
On remarque ici que l’intervalle obtenu est négatif, ce qui était prévisible car il s’agit de l’intervalle d1 - d2
et on a d1 < d2
.
Notez enfin que l’on peut tout à fait ajouter une durée à une date :
d1 = datetime.datetime(2020, 8, 27, 17, 23)
d2 = datetime.datetime(2020, 8, 27, 17, 28)
d3 = datetime.datetime(2020, 8, 27, 18, 00)
intervalle_de_temps = d2 - d1
print(d3 + intervalle_de_temps)
2020-08-27 18:05:00
Exercices#
Exercice 3.1
S’est-il écoulé plus de temps (i) entre le 2 Janvier 1920 à 7h32 et le 4 Mars 1920 à 5h53 ou bien (ii) entre le 30 Décembre 1999 à 17h12 et le 1er Mars 2000 à 15h53 ?
import datetime
# Complétez ce code
Solution
import datetime
interv1_date1 = datetime.datetime(1920, 1, 2, 7, 32)
interv1_date2 = datetime.datetime(1920, 3, 4, 5, 53)
duree1 = interv1_date2 - interv1_date1
interv2_date1 = datetime.datetime(1999, 12, 30, 17, 12)
interv2_date2 = datetime.datetime(2000, 3, 1, 15, 53)
duree2 = interv2_date2 - interv2_date1
if duree1 > duree2:
print("Le premier intervalle est le plus grand.")
else:
print("Le second intervalle est le plus grand.")
Exercice 3.2
À l’aide des fonctions du module datetime
vues plus haut, affichez, pour chaque année civile comprise entre 2010 et 2030, si elle est bissextile ou non.
xxxxxxxxxx
import datetime
# Complétez ce code
Solution
import datetime
duree_annee_normale = 365 * 24 * 60 * 60
for annee in range(2010, 2031):
date_debut = datetime.datetime(annee, 1, 1)
date_fin = datetime.datetime(annee + 1, 1, 1)
duree_anne_courante = date_fin - date_debut
if duree_anne_courante.total_seconds() > duree_annee_normale:
print(annee, "est bissextile")
else:
print(annee, "n'est pas bissextile")