Le module datetime en langage Python#
Dans les applications métier, l'ingénierie des données et la finance, la manipulation des données temporelles (dates d'inscriptions, séries chronologiques, délais de livraison, calculs d'échéances) est omniprésente.
Le module natif datetime fournit des types dédiés pour représenter des dates calendaires, des heures précises et effectuer des calculs arithmétiques temporels fiables en gérant les années bissextiles et le nombre variable de jours par mois.
1. Les classes fondamentales du module#
Le module propose quatre classes principales :
| Classe | Description | Exemple |
|---|---|---|
date |
Date calendaire idéalisée (année, mois, jour) | 2026-03-03 |
time |
Heure indépendante du calendrier (heure, minute, seconde, microseconde) | 14:30:00 |
datetime |
Combinaison complète d'une date et d'une heure | 2026-03-03 14:30:00 |
timedelta |
Représente une durée ou l'écart entre deux dates | 30 days, 2:00:00 |
from datetime import date, time, datetime, timedelta
# 1. Date du jour
aujourdhui = date.today()
print("Aujourd'hui :", aujourdhui) # ex: 2026-03-03
# 2. Instant présent avec microsecondes
maintenant = datetime.now()
print("Timestamp actuel :", maintenant)
# 3. Création manuelle d'un événement
naissance = date(1995, 10, 25)
print("Date specifiee :", naissance)
2. Arithmétique des dates avec timedelta#
Pour calculer une date future, passée ou évaluer l'écart séparant deux événements, on utilise l'objet timedelta :
from datetime import datetime, timedelta
maintenant = datetime.now()
# 1. Ajouter 30 jours et 2 heures (ex: expiration d'un abonnement)
echeance = maintenant + timedelta(days=30, hours=2)
print("Echeance du contrat :", echeance.strftime("%Y-%m-%d %H:%M"))
# 2. Soustraire une semaine
semaine_derniere = maintenant - timedelta(weeks=1)
# 3. Écart entre deux dates (renvoie un timedelta)
nouvel_an = datetime(2027, 1, 1)
decompte = nouvel_an - maintenant
print(f"Jours restants avant 2027 : {decompte.days} jours ({decompte.total_seconds() / 3600:.1f} heures)")
3. Formatage et Parsing : strftime contre strptime#
C'est le duo le plus crucial pour tout développeur ou analyste de données :
flowchart LR
A[Objet datetime] -->|strftime : Format vers Chaîne| B["Chaine de texte '03/03/2026'"]
B -->|strptime : Parse vers Objet| A
A. Formater un objet datetime en texte : strftime()#
(String Format Time) convertit une date en une chaîne personnalisée :
date_ref = datetime(2026, 3, 3, 15, 30, 45)
print(date_ref.strftime("%d/%m/%Y")) # '03/03/2026'
print(date_ref.strftime("%Y-%m-%d %H:%M:%S")) # '2026-03-03 15:30:45'
print(date_ref.strftime("%A %d %B %Y")) # 'Tuesday 03 March 2026'
Directives de formatage courantes#
| Directive | Signification | Exemple |
|---|---|---|
%Y |
Année complète sur 4 chiffres | 2026 |
%m |
Mois sous forme de nombre (01 à 12) | 03 |
%d |
Jour du mois sur deux chiffres (01 à 31) | 03 |
%H |
Heure au format 24h (00 à 23) | 15 |
%M |
Minute sur deux chiffres (00 à 59) | 30 |
%S |
Seconde sur deux chiffres (00 à 59) | 45 |
%A / %B |
Nom complet du jour / du mois en anglais | Tuesday / March |
B. Convertir une chaîne texte en objet datetime : strptime()#
(String Parse Time) analyse une chaîne selon un masque de formatage pour instancier un datetime :
chaine_recue = "15/10/2026 08:45"
masque = "%d/%m/%Y %H:%M"
# Conversion en objet manipulable
objet_date = datetime.strptime(chaine_recue, masque)
print("Type converti :", type(objet_date))
print("Annee extraite :", objet_date.year)
[!TIP] Norme ISO 8601 (Python 3.7+) :
Pour les formats standards ISOAAAA-MM-JJ, vous pouvez utiliser directementdate.fromisoformat("2026-03-03")sans spécifier de masque !
4. Timestamps UNIX et compatibilité#
Un timestamp UNIX représente le nombre de secondes écoulées depuis le 1er janvier 1970 à minuit UTC :
import time
from datetime import datetime
# 1. Obtenir le timestamp courant (secondes)
ts = datetime.now().timestamp()
print("Timestamp Unix :", ts)
# 2. Reconstruire une date à partir d'un timestamp
date_reconstruite = datetime.fromtimestamp(ts)
print("Date reconstruite :", date_reconstruite)
5. Mise en pratique : Calculateur d'échéancier de facturation#
Concevons un script professionnel qui calcule automatiquement la date limite de règlement d'une facture à « 30 jours fin de mois » :
from datetime import datetime, timedelta
def calculer_echeance_30j_fin_de_mois(date_emission_str: str) -> dict:
"""Calcule l'échéance à 30 jours fin de mois pour une facture donnée."""
date_emission = datetime.strptime(date_emission_str, "%Y-%m-%d")
# Étape 1 : Ajouter 30 jours
date_plus_30j = date_emission + timedelta(days=30)
# Étape 2 : Trouver le dernier jour du mois atteint
# Astuce : passer au 1er du mois suivant et reculer d'un jour
if date_plus_30j.month == 12:
premier_mois_suivant = datetime(date_plus_30j.year + 1, 1, 1)
else:
premier_mois_suivant = datetime(date_plus_30j.year, date_plus_30j.month + 1, 1)
date_limite = premier_mois_suivant - timedelta(days=1)
return {
"emission": date_emission.strftime("%d/%m/%Y"),
"limite_reglement": date_limite.strftime("%d/%m/%Y"),
"jours_accordes": (date_limite - date_emission).days
}
facture = calculer_echeance_30j_fin_de_mois("2026-03-12")
print("=== CONDITIONS DE REGLEMENT CLIENT ===")
print(f"Date d'emission : {facture['emission']}")
print(f"Echeance limite : {facture['limite_reglement']}")
print(f"Delai total accorde : {facture['jours_accordes']} jours")
6. Défi d'application#
Écrivez un programme nommé calculateur_age_exact.py qui demande à l'utilisateur sa date de naissance au format JJ/MM/AAAA et affiche son âge exact décomposé en années, mois et jours révolus par rapport à la date du jour.
Commentaires