Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Le contenu de ce chapitre est un peu hétérogène.
Avant d'aborder le traitement des dates et heures en Python je voudrais revenir sur les notions de module et de bibliothèque.
Ne confondez pas bibliothèque Python et module Python.
Les modules Python sont installés mais ne sont pas disponibles par défaut sauf le module de base ; il faut les "importer" !
Les bibliothèques (ou librairies) sont des extensions du langage Python. Il faut alors les installer sur votre ordinateur
(avec l'utilitaire PIP : voir plus loin dans ce chapitre).
Une bibliothèque peut comprendre plusieurs modules ; par exemple le module pyplot est un composant de la
bibliothèque matplotlib.
Un module est un ensemble de fonctions.
Par défaut seules les fonctions du module de base sont disponibles.
>>> randint(25) ... NameError: name 'randint' is not defined >>> sqrt(9) ... NameError: name 'sqrt' is not defined >>>
J'ai voulu générer de façon aléatoire un entier et obtenir la racine carrée de 9 mais je en récupère que des erreurs ...
Ces deux fonctions appelées ne sont pas des fonctions génériques ; n'appartiennent pas au module de base mais
respectivement aux modules random & math.
Il faut au préalable activer (on dit "importer") ces deux modules !
Pour importer, par exemple, les modules math & random on peut produire les commandes :
from math import* from random import *
Or si vous avez consulté d'autres sources documentaires, vous avez pu lire les instructions "import math" & "import random".
Avec la syntaxe "from nomModule import *" on peut ensuite appeler les fonctions du module importé sans les préfixer.
On peut donc écrire tout simplement :
sqrt(25) randint(100)
Par contre avec la syntaxe "import nomModule" la syntaxe des commandes qui suivent sera alors un plus lourde ; il faut préfixer la fonction avec le nom du module ou son alias (pseudo plus court) s'il existe.
>>>import random >>>import math >>>import datetime as dt >>>math.sqrt(25) >>>random.randint(100) >>>dt.time(12,30)
Ici j'ai donné l'alias "dt" au module datetime.
Et si vous oubliez de préfixer les fonctions vous aurez un message d'erreur.
>>> import math >>> sqrt(25) ... NameError: name 'sqrt' is not defined >>> math.sqrt(25) 5.0
Cette syntaxe d'importation semble préférable puisqu'elle dispense de préfixer ensuite les fonctions du module importé.
Paradoxalement il faut éviter cette syntaxe car elle présente un réel inconvenient lorsque vous importez plusieurs modules.
Je vais montrer lequel via un exemple ci-dessous.
Dans le module time il existe une fonction "time()" et dans le module datetime il existe aussi une fonction "time()" et elles ne sont pas substituables (elles ne font pas la même chose).
>>> from time import * >>> from datetime import * >>> time() datetime.time(0, 0)
L'interpréteur prend en compte la fonction "datetime.time()"; la fonction "time.time()" n'est plus disponible car écrasée.
>>> import time >>> import datetime as dt >>> time.time() 1704283959.2512217 >>> dt.time(12,30) datetime.time(12, 30)
J'ai donné un alias au module datetime donc je peux ensuite préfixer les fonctions avec cet alias.
Je peux utiliser les deux fonctions "time()" des différents modules.
Je rappelle que les fonctions de ces deux modules sont abordées plus loin dans ce chapitre.
Je pourrais citer d'autres exemples. Ainsi la fonction open() existe dans de nombreux modules : module de base, modules os & webbrowser. il faut éviter d'écraser la fonction open() du module de base ...
Mais comment connaitre la liste des fonctions d'un module et le rôle de chacune de ces fonctions ?
>>> import math >>> help(math) Help on built-in module math: NAME math DESCRIPTION This module provides access to the mathematical functions defined by the C standard. FUNCTIONS acos(x, /) Return the arc cosine (measured in radians) of x. The result is between 0 and pi. acosh(x, /) Return the inverse hyperbolic cosine of x. asin(x, /) Return the arc sine (measured in radians) of x. The result is between -pi/2 and pi/2. asinh(x, /) Return the inverse hyperbolic sine of x. ...
Pour découvrir toutes les fonctions d'un module il suffit de l'importer puis de taper la commande help(nomModule).
Pour avancer d'une page dans la liste tapez sur "espace".
La commande dir(nomModule) donne une information plus succincte.
>>> import random as rand >>> dir(rand) 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randbytes', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate'] >>>
La plupart des modules sont installés dans la version standard de Python mais d'autres doivent être chargées si nécessaire.
Si, par exemple, vous voulez tracer la courbe d'une fonction du deuxième degré (f(x) = ax2 + bx + c)
vous devrez utiliser des fonctions qui n'existent pas dans les modules installés mais disponibles dans la bibliothèque matplolib.
Pour télécharger cette bibliothèque, sans prise de tête, il suffit d'utiliser l'utilitaire pip.
Si vous vouliez créer des jeux vidéo en Python vous devrez installer la bibliothèque pygame.
Un des atouts de Python est la multitude de bibliothèques (ou librairies) disponibles.
Pour que le téléchargement de ces bibliothèques ne devienne pas un parcours du combattant il a été imaginé un outil
qui s'appelle pip.
pip est un gestionnaire de paquets utilisé pour installer et gérer des librairies Python.
À partir des versions 3, pip est inclus par défaut dans la distribution officielle du langage.
Donc, en clair, si vous avez installé
une version de Python 3, vous n'avez plus besoin d'installer l'utilitaire pip, c'est déjà fait !
Attention il faut lancer cet utilitaire à partir d'un terminal windows (CMD ou PowerShell) : "invite de commande".
Tapez "cmd" dans la zone de recherche de la barre d'état.
Par exemple, si vous voulez installer le micro framework python flask il suffit de taper : pip install flask
Ci-dessous capture d'écran qui montre toutes les librairies Python installées sur mon PC (commande : pip list) :
Notez que les librairies matplolib & numpy sont déjà installées.
Dans la suite de ce chapitre je vais vous présenter trois modules installés pour manipuler les dates et heures :
time & datetime & calendar.
Le module "time" fournit entre autres la date et l'heure de votre système.
Il propose aussi une fonction de temporisation : sleep(n).
Commandes à tester :
La commande time.time() retourne un nombre qui est le "timestamp" : le nombre de secondes entre le 1er janvier 1970 et l'instant présent. Le timestamp est une notion que l'on retrouve dans pratiquement tous les langages.
La commande time.localtime() affiche la date et l'heure système d'une façon plus claire.
Vous voyez donc que j'ai utilisé l'interpréteur le 8 janvier 2021.
time.strftime("%A %d %B %Y") : affichage de la date système avec le format habituel pour un Français : nomJour, rangJour, nomMois, anneé
time.strftime("%H : %M : %S") : affiche de l'heure du système avec un formatage : heures:minutes:secondes
Les symboles de formatage à utiliser avec cette fonction :
Symbole | Sens |
---|---|
%A | Nom du jour de la semaine |
%d | Jour du mois |
%B | Nom du mois |
%Y | Année |
%H | Heures |
%M | Minutes |
%S | Secondes |
time.sleep(20) : mise en pause durant 20 secondes. Vous constatez qu'après avoir appuyé sur ENTER les triples chevrons sont invisibles et
le curseur clignote. Au bout de 30 secondes, les chevrons réapparaissent.
Cette fonction ne présente pas beaucoup d'intérêt en mode commande par contre en mode programmé une temporisation peut être
parfois souhaitable.
>>> import locale >>> locale.setlocale(locale.LC_ALL, '') 'French_France.1252' >>> import time >>> time.strftime("%A%d%m%Y") 'lundi12082024' >>> time.strftime("%A %d %B %Y") 'lundi 12 août 2024' >>>
Le module locale donne accès à la base de données contenant les paramètres régionaux.
Le module datetime comprend trois fonctions importantes : date(), datetime(), time() respectivement pour créer une date, une heure, un instant (date & heure).
J'ai importe le module datetime avec un alias : dt car le nom du module est long.
L'appel des fonctions du module importé aura pour syntaxe : dt.nomFonction()
Nous avons dans le module "datetime" trois méthodes importantes : date(), time() & datetime().
La fonction date(Y,M,D) crée un objet avec la date précisée par les trois arguments.
On peut appliquer à cet objet les propriétés : year,month, day.
La fonction time() crée un objet avec l'heure précisée avec jusqu'à trois arguments (heure, minute,seconde).
Pour produire l'heure de minuit (00:00:00) il suffit d'utiliser la méthode time sans argument.
On peut appliquer à une heure les propriétés : hour, minute, seconde.
La méthode date() suivie de today() retourne la date du jour.
La fonction datetime() suivie de now() retourne l'instant présent : date et heure courantes.
On retrouve dans le module datetime la méthode strftime() que nous avions déjà utilisé avec le module time
Je ne reviens pas sur les symboles de formatage. Je précise simplement que la méthode retourne une chaine !
Je vais maintenant vous montrer comment calculer la différence en jours entre deux dates.
Commandes dans la console :
J'importe le module datetime sous le pseudo "dt".
Je crée une date "jour_an" avec la méthode date(année,mois,jour).
Je crée une deuxième date avec toujours cette méthode.
Dans "intervalle" je calcule la durée en jours entre ces deux dates qui retourne un tuple.
La variable "intervalle" est un objet timedelta de la classe datetime.
""" Nom du programme : calculer_age.py Objet : calcul de l'âge (en années) à partir de l'année de naissance """ from datetime import date def calculAge(annee_naiss): cejour = date.today() annee2 =cejour.year delta =annee2-annee_naiss return delta while True: try : naissance = input("Saisir année de naissance ou 'fin' : ") if naissance =="fin": break naissance =eval(naissance) print(f"{calculAge(naissance)} ans") except: print("saisie incorrecte")
La fonction "calculAge()" :
Dans cette fonction il faut extraire de la date du jour l'année.
Le programme principal :
Une boucle infinie permet de calculer plusieurs âges, de recommencer la saisie après une saisie incorrecte.
Dans cette boucle une gestion des exceptions.
Je rappelle que toute valeur saisie via input() est de type string
donc ne pas oublier la conversion sinon la soustraction (dans la fonction) 'plantera'.
Saisir année de naissance ou 'fin' : 19oo saisie incorrecte Saisir année de naissance ou 'fin' : 1960 64 ans Saisir année de naissance ou 'fin' : 1977 47 ans Saisir année de naissance ou 'fin' : fin >>>
Premier essai : saisie de deux lettres O donc branchement sur "except" mais on reste dans la boucle.
Le module calendar est un module intégré qui fournit des fonctions pour travailler avec des calendriers.
Il vous permet de créer et de manipuler des calendriers, de les imprimer et de réaliser divers calculs impliquant des dates et
des heures.
>>> import calendar >>> calendar.prmonth(2023,12) December 2023 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>> calendar.prmonth(2023,11) November 2023 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>> a =2024 >>> m =1 >>> calendar.prmonth(a,m) January 2024 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>>
J'ai affiché les calendriers des mois de décembre et novembre 2023 mais auss de janvier 2924 gràce à la
méthode premonth(annee,mois).
Je vous montre aussi que la méthode prmonth() de la classe calendar peut être argumentée avec des variables.
Notez que la première colonne correspond aux lundis.
Le programme tient en quelques lignes !
# nom du programme : calendrier_2024.py import calendar # Create calendrier 2024 a = 2024 for m in range(1,13) : calendar.prmonth(a,m) print("-----")
Cette fois je vais employer la méthode monthrange(année,mois) de la classe calendar.
>>> import calendar >>> info = calendar.monthrange(2023,12) >>> print(info) (4, 31) >>> n_jours = calendar.monthrange(2023,12)[1] >>> print(n_jours) 31 >>>
La deuxième commande retourne sous forme d'un tuple le rang du premier jour du mois et le nombre
de jours dans le mois. On apprend que le mois de décembre 2023 commence par un vendredi ("weekday" de rang 4).
Donc pour récupérer le nombre de jours il faut rajouter "[1]" à la commande (extraction du 2ième élément du tuple);
commande qui devient donc : n_jours = calendar.monthrange(2023,12)[1].
On apprend que le mois de décembre compte 31 jours.
Ici je vais utiliser une méthode qui retourne un booléen.
... >>> bissextile = calendar.isleap(2022) >>> print(bissextile) False
C'est un peu plus compliqué : il faut enchainer trois commandes.
>>> c=calendar.TextCalendar(calendar.SUNDAY) >>> c_2023_12 =c.formatmonth(2023,12) >>> print(c_2023_12) December 2023 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Calendar.TextCalendar(calendar.SUNDAY) indique à la console de créer un calendrier texte ; la première colonne
du calendrier sera celle des dimanches.
c.formatmonth(2023,12) : établissement du calendrier du mois de décembre 2023
Dernière commande : affichage du calendrier.
Attention ce script génère du HTML !
# nom du programme : calendrier_html_2024.py import calendar # Create calendrier 2024 au format HTML a = 2024 c =calendar.HTMLCalendar(calendar.SUNDAY) for m in range(1,13) : c_mois =c.formatmonth(a,m) print(c_mois)
Il suffit de copier tout le code HTML généré par ce programme dans un document HTML puis de rajouter la partie HEAD
et de nommer ce fichier "calendrier2024.htm"
Ci-dessous la page "calendrier2024.htm" affichée dans un Iframe :