datetime from - Giorni lavorativi in Python





4 Answers

Sembrano esserci diverse opzioni se sei aperto all'installazione di librerie aggiuntive.

Questo post descrive un modo di definire i giorni lavorativi con dateutil .

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html

BusinessHours ti consente di definire in modo personalizzato il tuo elenco di festività, ecc., Per definire quando sono gli orari di lavoro (e per estensione giorni lavorativi).

http://pypi.python.org/pypi/BusinessHours/

string to timestamp

Devo sottrarre i giorni lavorativi dalla data corrente.

Al momento ho del codice che deve essere sempre in esecuzione il giorno lavorativo più recente. Quindi potrebbe essere oggi se siamo da lunedì a venerdì, ma se è sabato o domenica, allora devo riportarlo al venerdì prima del fine settimana. Al momento ho un codice piuttosto goffo per fare questo:

 lastBusDay = datetime.datetime.today()
 if datetime.date.weekday(lastBusDay) == 5:      #if it's Saturday
     lastBusDay = lastBusDay - datetime.timedelta(days = 1) #then make it Friday
 elif datetime.date.weekday(lastBusDay) == 6:      #if it's Sunday
     lastBusDay = lastBusDay - datetime.timedelta(days = 2); #then make it Friday

C'è un modo migliore?

Posso dire a timedelta di lavorare nei giorni feriali piuttosto che nei giorni di calendario, ad esempio?




Forse questo codice potrebbe aiutare:

lastBusDay = datetime.datetime.today()
shift = datetime.timedelta(max(1,(lastBusDay.weekday() + 6) % 7 - 3))
lastBusDay = lastBusDay - shift

L'idea è che il lunedì devi tornare 3 giorni, la domenica 2 e 1 in qualsiasi altro giorno.

L'istruzione (lastBusDay.weekday() + 6) % 7 ripropone il lunedì da 0 a 6.

Davvero non so se questo sarà migliore in termini di prestazioni.




Questo darà un generatore di giorni lavorativi, ovviamente senza vacanze, stop è l'oggetto datetime.datetime. Se hai bisogno di una vacanza basta fare ulteriori argomenti con l'elenco delle vacanze e controllare con 'IFology' ;-)

def workingdays(stop, start=datetime.date.today()):
    while start != stop:
        if start.weekday() < 5:
            yield start
        start += datetime.timedelta(1)

Più tardi puoi contarli come

workdays = workingdays(datetime.datetime(2015, 8, 8))
len(list(workdays))



 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 



Related