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, timedelta

La 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 None

Diffé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 None

Diffé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 None

Ajouter 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 None

Ajouter 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 None

Date 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 None

Formater 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 0

Est-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 None

Automatisation : 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 None

Récapitulatif des codes utiles

OpérationCode
Date du jourdate.today()
Différence jours(date2 - date1).days
Ajouter X joursdate + timedelta(days=X)
Annéedate.year
Moisdate.month
Jour semainedate.weekday() (0=Lundi)
Format FRdate.strftime("%d/%m/%Y")
Trimestre(date.month - 1) // 3 + 1

Ressources complémentaires