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

PolYarBear Points 23

Ne compliquez pas trop les choses)

lastBusDay = datetime.datetime.today()
timedelta_tuple = (0, 0, 0, 0, 0, -1, -2)
lastBusDay = lastBusDay + datetime.timedelta(days = timedelta_tuple[lastBusDay.weekday()])

0voto

nehemiahjacob Points 122

Cette fonction peut vous être utile

def getPreviousBusinessDay(fromDate):
        import datetime
        previousBuinessDate = datetime.datetime.strptime(fromDate, "%Y/%m/%d")
        previousBuinessDate = previousBuinessDate + datetime.timedelta(days=-1)
        if datetime.date.weekday(previousBuinessDate) not in range(0,5):
                previousBuinessDate = previousBuinessDate + datetime.timedelta(days=-1)
        if datetime.date.weekday(previousBuinessDate) not in range(0,5):
                previousBuinessDate = previousBuinessDate + datetime.timedelta(days=-1)
        return previousBuinessDate.strftime('%Y/%m/%d')

testDate = "2013/9/1"
for x in range(1,100) :
        testDate=getPreviousBusinessDay(testDate)
        print testDate

0voto

Ben Points 346

Une version simplifiée

dernierJourOuvrable = datetime.datetime.today()
jourSemaine = datetime.date.weekday(dernierJourOuvrable)
if jourSemaine > 4:      #si c'est samedi ou dimanche
    dernierJourOuvrable = dernierJourOuvrable - datetime.timedelta(days = jourSemaine-4) #alors faire en sorte que ce soit vendredi

0voto

Patrick Points 11

Solution indépendante des différents territoires ayant des jours fériés différents :

Si vous avez besoin de trouver le bon identifiant dans un tableau, vous pouvez utiliser cet extrait de code. Le modèle Table est un modèle sqlalchemy et les dates à rechercher sont dans le champ day.

def last_relevant_date(db: Session, given_date: date) -> int:
    available_days = (db.query(Table.id, Table.day)
                      .order_by(desc(Table.day))
                      .limit(100).all())
    close_dates = pd.DataFrame(available_days)
    close_dates['delta'] = close_dates['day'] - given_date
    past_dates = (close_dates
                  .loc[close_dates['delta'] < pd.Timedelta(0, unit='d')])
    table_id = int(past_dates.loc[past_dates['delta'].idxmax()]['id'])
    return table_id

Ce n'est pas une solution que je recommanderais lorsque vous devez convertir en masse. C'est plutôt générique et coûteux car vous n'utilisez pas de jointures. De plus, cela suppose que vous avez un jour pertinent qui est l'un des 100 jours les plus récents dans le modèle Table. Ainsi, cela aborde l'entrée de données qui peut avoir différentes dates.

0voto

Chenxi Xiao Points 1
de datetime import timedelta, date
de business_days import business_days

définition business_days(
    start_date: date, end_date: date
) -> Générateur[date, Aucun, Aucun]:
    us_holidays = holidays.country_holidays("US")

    date_diff = end_date - start_date

    pour jour dans plage(date_diff.days + 1):
        the_date = start_date + timedelta(days=day)
        si (the_date.weekday() < 5) et (the_date pas dans us_holidays):
            produire the_date

pour jour_ouvres dans business_days(date(2023, 7, 1), date(2023, 9,1)):
    imprimer(jour_ouvres)

utiliser DateTime yesterday = DateTime.Now.Date.AddDays(-1); et la solution ci-dessus

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