""" Module de manipulation de dates/semaines. Ce module contient un ensemble de fonction permettant de passer de date en numéro de semaine et vice-versa (de numéro de semaine en date). """ import pendulum def from_week_number_to_date(season, week_number): """Renvoie la date du début de semaine (lundi) et la date de fin de semaine (dimanche) à partir d'une saison et d'un numéro de semaine. Args: season str saison (ex : "2022-2023") week_number int numéro de semaine Returns : start_date Date du lundi de la semaine end_date Date du dimanche de la semaine Examples: >>> from jarvis.tools.date_week_transition import from_week_number_to_date >>> from_week_number_to_date("2022-2023", 6) >>> (DateTime(2022, 10, 3, 0, 0, 0, tzinfo=Timezone('UTC')), DateTime(2022, 10, 9, 0, 0, 0, tzinfo=Timezone('UTC'))) >>> from_week_number_to_date("2022-2023", 22) >>> (DateTime(2023, 1, 30, 0, 0, 0, tzinfo=Timezone('UTC')), DateTime(2023, 2, 5, 0, 0, 0, tzinfo=Timezone('UTC'))) >>> from_week_number_to_date("2022-2023", 44) >>> (DateTime(2023, 7, 3, 0, 0, 0, tzinfo=Timezone('UTC')), DateTime(2023, 7, 9, 0, 0, 0, tzinfo=Timezone('UTC'))) """ dash = season.find("-") first_year = season[:dash] season_begin = pendulum.parse(str(first_year) + "09-01") season_first_week = season_begin.week_of_year rest_of_week = 52 - season_first_week week_string = "-W" if week_number <= rest_of_week: week_number += season_first_week - 1 year = first_year else: week_number -= rest_of_week year = str(season[dash + 1 :]) if week_number - rest_of_week < 10: week_string += "0" start_date = pendulum.parse(year + week_string + str(week_number)) end_date = start_date.add(days=6) return start_date, end_date def from_date_to_week_number(the_date=None): """Renvoie le numéro de la semaine depuis le début de la saison. Une saison commence le 1er septembre. La semaine contenant le 1er septembre est la semaine 1, même si le 1er septembre est un diamnche. Args: date date date à convertir Returns : int nombre de semaine entre la date en paramètre et le début de la saison. Examples: >>> from jarvis.tools.date_week_transition import from_date_to_week_number >>> import pendulum >>> from_date_to_week_number(pendulum.date(2022, 9, 1)) >>> 1 >>> from_date_to_week_number(pendulum.date(2023, 2, 5)) >>> 22 >>> from_date_to_week_number(pendulum.date(2023, 7, 5)) >>> 44 """ if the_date is None: the_date = pendulum.today().date() else: the_date = pendulum.parse(the_date.strftime("%Y%m%d")) number_of_year_week = the_date.week_of_year if the_date.month >= 9: # nouvelle saison season = str(the_date.year) + "-" + str(the_date.year + 1) begin_season = pendulum.date(the_date.year, 9, 1) season_first_week = begin_season.week_of_year number_of_season_week = number_of_year_week + 1 - season_first_week else: # "ancienne" saison season = str(the_date.year - 1) + "-" + str(the_date.year) begin_season = pendulum.date(the_date.year - 1, 9, 1) season_first_week = begin_season.week_of_year number_of_season_week = number_of_year_week + (52 - season_first_week) return season, number_of_season_week def get_number_of_weeks_between(first_date, second_date): """ Renvoie le nombre de semaines entre deux dates. Par extension, cela permet de connaitre le nombre d'occurence d'un évènement (entraînement, par exemple) hebdromadaire entre deux dates et ainsi pouvoir plannifier. Args: first_date date date du premier évènement second_date date date du second évènement Returns : int nombre de semaine entre les deux dates Examples: >>> from jarvis.tools.date_week_transition import get_number_of_weeks_between >>> import pendulum >>> get_number_of_weeks_between(pendulum.date(2022, 9, 1), pendulum.date(2022, 9, 4)) >>> 0 >>> get_number_of_weeks_between(pendulum.date(2022, 9, 1), pendulum.date(2023, 2, 5)) >>> 22 >>> get_number_of_weeks_between(pendulum.date(2022, 9, 1), pendulum.date(2023, 7, 5)) >>> 44 >>> get_number_of_weeks_between(pendulum.date(2023, 2, 5), pendulum.date(2023, 7, 5)) >>> 22 """ first = pendulum.parse(first_date.strftime("%Y%m%d")) second = pendulum.parse(second_date.strftime("%Y%m%d")) if first_date.year == second.year: return second.week_of_year - first.week_of_year elif second_date.year > first_date.year: return (52 - first.week_of_year) + second.week_of_year else: return (52 - second.week_of_year) + first.week_of_year