2010-02-08 11 views
47

Ich muss Werktage vom aktuellen Datum subtrahieren.Werktage in Python

Ich habe derzeit einen Code, der immer am letzten Geschäftstag ausgeführt werden muss. Das mag heute sein, wenn wir von Montag bis Freitag sind, aber wenn es Samstag oder Sonntag ist, muss ich es auf den Freitag vor dem Wochenende zurückstellen. Im Moment habe ich ein paar ziemlich klobig Code, dies zu tun:

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 

Gibt es einen besseren Weg?

Kann ich Timedelta sagen, dass es in Wochentagen statt in Kalendertagen arbeiten soll?

+5

zählen Was ist Urlaub? – SLaks

+0

Ja, ich kümmere mich schon um diese: Meine Datenbank füllt immer wieder Ferien auf, solange sie auf einen Wochentag fallen. Aber ich stimme zu, Ferien im Allgemeinen sind auch ein Problem. Ich meine, ich könnte anfangen, schick zu werden und die sckits.timeseries zu benutzen, aber wirklich will ich etwas einfacheres. –

+0

Hier ist ein Ausschnitt von dzzone, der Ihnen vielleicht weiterhelfen könnte: http://snippets.dzone.com/posts/show/9173 –

Antwort

76

Verwenden Pandas!

import pandas as pd 
# BDay is business day, not birthday... 
from pandas.tseries.offsets import BDay 

# pd.datetime is an alias for datetime.datetime 
today = pd.datetime.today() 
print today - BDay(4) 

Seit heute ist Donnerstag, 26. September, die Sie mit einer Leistung von geben:

datetime.datetime(2013, 9, 20, 14, 8, 4, 89761) 
+2

Schön. Das ist die richtige Antwort, heute. Als ich die Q fragte, war Pandas immer noch ein wenig unvollständig. –

+3

Die neueste Pandas-Version (0.14.0) unterstützt auch Urlaubskalender – fantabolous

12

Es gibt verschiedene Möglichkeiten, wenn Sie zusätzliche Bibliotheken installieren möchten. Dieser Beitrag beschreibt eine Möglichkeit, Arbeitstage mit dateutil zu definieren.

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

Geschäftszeiten können Sie Ihre Liste der Urlaub individuell definieren, usw., zu definieren, wenn Ihre Arbeitszeit (und durch Verlängerung Arbeitstage) sind.

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

+0

nette Alison. Immer noch nicht sehr einfach, aber leider. Ich werde aber deine Route gehen. Danke für die Hilfe. –

+1

Das Definieren von Arbeitstagen in allen Kulturen ist wahrscheinlich nicht einfach genug, um in die Standardbibliothek aufgenommen zu werden. –

+2

Ein stichhaltiger Punkt, denn meine Bewerbung gilt tatsächlich für die Finanzmärkte, und Ägypten und Israel sind am Sonntag geöffnet. –

6

Vielleicht könnte dieser Code helfen:

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

Die Idee ist, dass am Montag muß yo zurück 3 Tage gehen, am Sonntag 2 und 1 in jedem anderen Tag.

Die Aussage (lastBusDay.weekday() + 6) % 7 gerade wieder Basen Montag von 0 bis 6

weiß wirklich nicht, ob dies in Bezug auf die Leistung besser sein wird.

0

Warum versuchen Sie nicht so etwas wie:

lastBusDay = datetime.datetime.today() 
if datetime.date.weekday(lastBusDay) not in range(0,5): 
    lastBusDay = 5 
0
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 
9

DISCLAMER: Ich bin der Autor ...

I schrieb ein Paket, das genau das macht, Geschäftsdatenberechnungen. Sie können benutzerdefinierte Wochenspezifikationen und Feiertage verwenden.

Ich hatte dieses genaue Problem beim Arbeiten mit Finanzdaten und fand keine der verfügbaren Lösungen besonders einfach, also schrieb ich eine.

Ich hoffe, dies ist nützlich für andere Menschen.

https://pypi.python.org/pypi/business_calendar/

+1

Vielen Dank, Ihre Bibliothek funktionierte perfekt für mich. Vielleicht solltest du deiner Dokumentation hinzufügen, dass deine Bibliothek negative Tage unterstützt, wenn du Tage subtrahieren willst, und dass es auf pip steht. – guinunez

+0

Hey, ich weiß, dass dies nicht der beste Weg ist, um dich zu erreichen, aber ich wollte nur ein Problem melden Ich hatte mit Ihrem Business_Calendar-Modul. Ich habe einen Kalender mit US-Bundesfeiertagen eingerichtet: ['2015-01-01', '2015-01-19', '2015-02-16', '2015-05-25', '2015-07- 03 ',' 2015-09-07 ', ' 2015-10-12 ',' 2015-11-11 ', ' 2015-11-26 ',' 2015-12-25 '] dann versucht, die zu berechnen Unterschied zwischen datetime (2015, 1, 16, 15, 28, 40) und datetime (2015, 1, 23, 11, 58, 0), aber es gibt konstant -1 zurück. Stripping der h/m/s von den Datumsangaben Ergebnisse (richtig) in 4. –

+1

Eigentlich bei weiteren Tests bestimmte Datumsvergleiche einfach blockieren, ohne ersichtlichen Grund, scheint nie ein Ergebnis zurückgeben. In meinem obigen Beispiel führt der Versuch, datetime (2015, 1, 16) mit datetime (2015, 1, 25) zu vergleichen, zu einem solchen Block, mit oder ohne explizite Festlegung von Feiertagen. Bei einer Untersuchung tritt dies auf, wenn der Parameter date2 ein Datum ist, das kein Arbeitstag ist. –

2

Dieser einem Generator des Arbeitstages geben wird natürlich ohne Feiertage, ist Stop datetime.datetime Objekt. Wenn Sie einen Urlaub nur machen zusätzliches Argument mit der Liste der Feiertage und überprüfen Sie mit ‚IFology‘ müssen ;-)

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

auf Sie Später können sie wie

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