Manipuler les Dates avec Python dans Grist : Guide Complet
Pourquoi les dates sont complexes
Les calculs de dates sont parmi les plus demandés en entreprise : âges, durées, échéances, jours ouvrés... Python dans Grist simplifie tout cela avec des fonctions puissantes.
Les bases : Importer et créer des dates
Import obligatoire
Toujours commencer vos formules par :
from datetime import datetime, date, timedeltaLa date d'aujourd'hui
from datetime import date
aujourd_hui = date.today()
# ou
maintenant = datetime.now()Différence : date = jour uniquement, datetime = jour + heure
Extraire des informations d'une date
Composants d'une date
if $Date:
annee = $Date.year # 2026
mois = $Date.month # 3 (mars)
jour = $Date.day # 31
# Jour de la semaine
jour_semaine = $Date.weekday() # 0=Lundi, 6=Dimanche
# Nom du jour (si besoin)
jours = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"]
nom_jour = jours[$Date.weekday()]
return f"{$Date} → {nom_jour} {jour}/{mois}/{annee}"
return "Pas de date"Trimestre et semaine
if $Date:
trimestre = ($Date.month - 1) // 3 + 1 # 1, 2, 3 ou 4
semaine = $Date.isocalendar()[1] # Numéro de semaine ISO
return f"T{trimestre} - Semaine {semaine}"
return "—"Calculer des durées
Différence en jours
if $Date_debut and $Date_fin:
duree = ($Date_fin - $Date_debut).days
return duree
return NoneDifférence en mois (approximation)
if $Date_debut and $Date_fin:
mois = ($Date_fin.year - $Date_debut.year) * 12 + ($Date_fin.month - $Date_debut.month)
return mois
return NoneDifférence en années (âge précis)
from datetime import date
if $Date_naissance:
auj = date.today()
age = auj.year - $Date_naissance.year
if (auj.month, auj.day) < ($Date_naissance.month, $Date_naissance.day):
age -= 1
return age
return NoneAjouter ou soustraire du temps
Ajouter des jours
from datetime import timedelta
if $Date:
dans_7_jours = $Date + timedelta(days=7)
dans_1_mois = $Date + timedelta(days=30)
return dans_7_jours
return NoneAjouter des jours ouvrés (hors week-end)
from datetime import timedelta
def ajouter_jours_ouvres(date_debut, nb_jours):
date_actuelle = date_debut
jours_ajoutes = 0
while jours_ajoutes < nb_jours:
date_actuelle += timedelta(days=1)
if date_actuelle.weekday() < 5: # 0-4 = Lundi-Vendredi
jours_ajoutes += 1
return date_actuelle
if $Date:
return ajouter_jours_ouvres($Date, 5) # +5 jours ouvrés
return NoneDate de fin de mois
from datetime import timedelta
if $Date:
if $Date.month == 12:
prochain_mois = $Date.replace(year=$Date.year + 1, month=1)
else:
prochain_mois = $Date.replace(month=$Date.month + 1)
fin_mois = prochain_mois - timedelta(days=1)
return fin_mois
return NoneFormater les dates
Format français standard
if $Date:
return $Date.strftime("%d/%m/%Y") # 31/03/2026
return "—"Format avec nom du mois
if $Date:
mois_fr = ["", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
"Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"]
return f"{$Date.day} {mois_fr[$Date.month]} {$Date.year}"
return "—"Format relatif (il y a X jours)
from datetime import date
if $Date:
delta = (date.today() - $Date).days
if delta == 0:
return "Aujourd'hui"
elif delta == 1:
return "Hier"
elif delta < 7:
return f"Il y a {delta} jours"
elif delta < 30:
return f"Il y a {delta // 7} semaines"
else:
return $Date.strftime("%d/%m/%Y")
return "—"Calculs avancés
Jours ouvrés entre deux dates (hors week-end)
from datetime import timedelta
def compter_jours_ouvres(debut, fin):
if not debut or not fin:
return 0
jours = 0
date_actuelle = debut
while date_actuelle <= fin:
if date_actuelle.weekday() < 5: # Lundi-Vendredi
jours += 1
date_actuelle += timedelta(days=1)
return jours
if $Date_debut and $Date_fin:
return compter_jours_ouvres($Date_debut, $Date_fin)
return 0Est-ce un jour ouvré ?
if $Date:
if $Date.weekday() < 5:
return "✅ Ouvré"
elif $Date.weekday() == 5:
return "🔵 Samedi"
else:
return "🔴 Dimanche"
return "—"Prochain jour ouvré
from datetime import timedelta
def prochain_ouvre(date_actuelle):
date_test = date_actuelle + timedelta(days=1)
while date_test.weekday() >= 5: # Tant que week-end
date_test += timedelta(days=1)
return date_test
if $Date:
return prochain_ouvre($Date)
return NoneAutomatisation : Alertes et échéances
Alerte avant échéance
from datetime import datetime, timedelta
if $Date_echeance:
jours_restants = ($Date_echeance - datetime.now()).days
if jours_restants < 0:
return "🔴 EN RETARD"
elif jours_restants == 0:
return "⚠️ C'EST AUJOURD'HUI"
elif jours_restants <= 3:
return f"🟠 Dans {jours_restants} jours"
elif jours_restants <= 7:
return f"🟡 Cette semaine"
else:
return f"🟢 Dans {jours_restants} jours"
return "⚪ Non planifié"Date de relance automatique
from datetime import timedelta
if $Date_facture:
# Relance à J+30
return $Date_facture + timedelta(days=30)
return NoneRécapitulatif des codes utiles
| Opération | Code |
|---|---|
| Date du jour | date.today() |
| Différence jours | (date2 - date1).days |
| Ajouter X jours | date + timedelta(days=X) |
| Année | date.year |
| Mois | date.month |
| Jour semaine | date.weekday() (0=Lundi) |
| Format FR | date.strftime("%d/%m/%Y") |
| Trimestre | (date.month - 1) // 3 + 1 |