102 votes

Jour ouvré précédent le plus récent en Python

Je dois soustraire des jours ouvrés de la date actuelle.

J'ai actuellement du code qui doit toujours être en cours d'exécution le jour ouvré le plus récent. Ainsi, ce peut être aujourd'hui si nous sommes du lundi au vendredi, mais si c'est samedi ou dimanche alors je dois le ramener au vendredi précédent le week-end. J'ai actuellement un code assez lourd pour faire cela :

 lastBusDay = datetime.datetime.today()
 if datetime.date.weekday(lastBusDay) == 5:      #si c'est samedi
     lastBusDay = lastBusDay - datetime.timedelta(days = 1) #alors faire de vendredi
 elif datetime.date.weekday(lastBusDay) == 6:      #si c'est dimanche
     lastBusDay = lastBusDay - datetime.timedelta(days = 2); #alors faire de vendredi

Est-ce qu'il y a une meilleure façon?

Puis-je dire à timedelta de travailler en jours ouvrés plutôt qu'en jours calendaires par exemple?

1voto

TheMan Points 331
 def getNthBusinessDay(startDate, businessDaysInBetween):
    currentDate = startDate
    daysToAdd = businessDaysInBetween
    while daysToAdd > 0:
        currentDate += relativedelta(days=1)
        day = currentDate.weekday()
        if day < 5:
            daysToAdd -= 1

    return currentDate

1voto

Chetabahana Points 3161

Lorsque j'écris cette réponse, aujourd'hui est vendredi aux États-Unis, donc le prochain jour ouvrable sera lundi, pendant ce temps hier était jour de Thanksgiving donc le jour ouvrable précédent devrait être mercredi

Donc aujourd'hui, la date du vendredi 24 novembre 2022, est un moment parfait pour obtenir les jours ouvrables précédents, actuels et suivants.

En faisant des essais-erreurs, j'ai pu trouver le résultat correct en combinant la méthode ci-dessous:

from datetime import datetime, timedelta

from pandas.tseries.offsets import BDay
from pandas.tseries.offsets import CustomBusinessDay
from pandas.tseries.holiday import USFederalHolidayCalendar

US_BUSINESS_DAY = CustomBusinessDay(calendar=USFederalHolidayCalendar())

TODAY = datetime.today() - 1 * US_BUSINESS_DAY
YESTERDAY = (datetime.today() - timedelta(max(1,(TODAY.weekday() + 6) % 7 - 3))) - 1 * US_BUSINESS_DAY
TOMORROW = TODAY + BDay(1)

DAY_NAME = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday']

BUSINESS_DATE = "[Previous (" + DAY_NAME[YESTERDAY.weekday()] + "):'" + YESTERDAY.strftime('%y%m%d') 
BUSINESS_DATE += "', Current (" + DAY_NAME[TODAY.weekday()] + "):'" + TODAY.strftime('%y%m%d') 
BUSINESS_DATE +=  "', Next (" + DAY_NAME[TOMORROW.weekday()] + "):'" + TOMORROW.strftime('%y%m%d') + "']"

print_("Date d'activité aux USA = ", BUSINESS_DATE)

Résultat:

Date d'activité aux USA = [Previous (Mercredi):'221123', Current (Vendredi):'221125', Next (Lundi):'221128']

1voto

Allan Points 81

Obtenir le jour ouvré le plus récent :

pd.bdate_range(fin=(pd.to_datetime('aujourd'hui').date()), périodes=1)[0])

Ou si vous le voulez au format 'datetime.date' :

(pd.bdate_range(fin=(pd.to_datetime('aujourd'hui').date()), périodes=1)[0]).date()

1voto

Troy D Points 468

La réponse acceptée donne en fait un résultat incorrect car aujourd'hui - BDay(0) avance vers lundi pendant le week-end au lieu de revenir à vendredi comme le dit la question. Ce que vous voulez est BusinessDay().rollback() qui revient au jour ouvrable précédent (la réponse acceptée correspond à la logique de BusinessDay().rollforward()).

import pandas as pd
import datetime

aujourd'hui = datetime.datetime.today()
jour_ouv_prec = pd.tseries.offsets.BusinessDay().rollback(aujourd'hui)

1voto

SAHIL BHANGE Points 691

Obtenez le premier jour du mois, le dernier jour du mois et le dernier jour ouvrable du mois précédent si le dernier jour tombe un samedi ou un dimanche

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
day = datetime(2023, 1, 10)
#last day of (n) previous month (n=months)
#n = 0 -- for current month
n=1
lastDayMonth = ((day - relativedelta(months=n) + relativedelta(day=31)).date());
#First day of previous month (n=months=1)
firstDayMonth = ((day - relativedelta(months=n) + relativedelta(day=1)).date());
print("Last Day of Month - "+ str(lastDayMonth))
print("First Day of Month - "+ str(firstDayMonth))
#Last business day (Friday) of prev (n) month (n=months=1)
lastBusDay = (lastDayMonth - timedelta(max(1,(lastDayMonth.weekday() + 6) % 7 - 3))) if lastDayMonth.weekday() in (5,6) else lastDayMonth
print("Last Business Day of Month - " + str(lastBusDay))
print()
--- Output
Last Day of Month - 2022-12-31
First Day of Month - 2022-12-01
Last Business Day of Month - 2022-12-30

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X