Skip to content

Instantly share code, notes, and snippets.

@databill86
Forked from SebCorbin/jours_ouvrés_francais.py
Created November 5, 2019 10:31
Show Gist options
  • Save databill86/f5066a1ae6d01fe951a865e2957d249d to your computer and use it in GitHub Desktop.
Save databill86/f5066a1ae6d01fe951a865e2957d249d to your computer and use it in GitHub Desktop.

Revisions

  1. @SebCorbin SebCorbin renamed this gist Oct 7, 2018. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions main.py → jours_ouvrés_francais.py
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,7 @@
    """
    Générateur de jours ouvrés français en python
    """

    def easter_date(year):
    """
    Calcule la date du jour de Pâques d'une année donnée
  2. @SebCorbin SebCorbin created this gist Oct 7, 2018.
    63 changes: 63 additions & 0 deletions main.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    def easter_date(year):
    """
    Calcule la date du jour de Pâques d'une année donnée
    Voir https://github.com/dateutil/dateutil/blob/master/dateutil/easter.py
    :return: datetime
    """
    a = year // 100
    b = year % 100
    c = (3 * (a + 25)) // 4
    d = (3 * (a + 25)) % 4
    e = (8 * (a + 11)) // 25
    f = (5 * a + b) % 19
    g = (19 * f + c - e) % 30
    h = (f + 11 * g) // 319
    j = (60 * (5 - d) + b) // 4
    k = (60 * (5 - d) + b) % 4
    m = (2 * j - k - g + h) % 7
    n = (g - h + m + 114) // 31
    p = (g - h + m + 114) % 31
    day = p + 1
    month = n
    return datetime(year, month, day)


    def is_holiday(the_date):
    """
    Vérifie si la date donnée est un jour férié
    :param the_date: datetime
    :return: bool
    """
    year = the_date.year
    easter = easter_date(year)
    days = [
    datetime(year, 1, 1), # Premier de l'an
    easter + timedelta(days=1), # Lundi de Pâques
    datetime(year, 5, 1), # Fête du Travail
    datetime(year, 5, 8), # Victoire de 1945
    easter + timedelta(days=39), # Ascension
    easter + timedelta(days=49), # Pentecôte
    datetime(year, 7, 14), # Fête Nationale
    datetime(year, 8, 15), # Assomption
    datetime(year, 11, 1), # Toussaint
    datetime(year, 11, 11), # Armistice 1918
    datetime(year, 12, 25), # Noël
    ]
    return the_date in days


    def business_days(date_from, date_to):
    """
    Générateur retournant les jours ouvrés dans la période [date_from:date_to]
    :param date_from: Date de début de la période
    :param date_to: Date de fin de la période
    :return: Générateur
    """
    while date_from <= date_to:
    # Un jour est ouvré s'il n'est ni férié, ni samedi, ni dimanche
    if not is_holiday(date_from) and date_from.isoweekday() not in [6, 7]:
    yield date_from
    date_from += timedelta(days=1)