2012-02-08 11 views
8

Dwa powiązane zagadnienia: (1) Wszystkie dane, z którymi pracuję, mają załączone dni tygodnia. W różnych punktach muszę wiedzieć, jaki jest następny dzień tygodnia. Napisałem coś podobnego do poniższego kodu, aby dokonać tej determinacji, ale jestem pewien, że jest lepszy sposób. Ktoś? (2) Idealnie, muszę wiedzieć nie tylko następny dzień powszedni, ale następny w USA dzień roboczy - to jest następny dzień roboczy, który nie jest świętem na rynku amerykańskim. Każda pomoc w tej sprawie również byłaby świetna.Datetime Python - Następny dzień roboczy

import datetime as dt 

day = dt.datetime.strptime('2012-02-03','%Y-%m-%d').date() 
print day#day=2012-03-02 (Friday) 

if day.weekday()==4: 
    day = day+dt.timedelta(days=3) 
else: 
    day = day+dt.timedelta(days=1) 

print day#day=2012-02-06 (Monday) 
day = day+dt.timedelta(days=1) 
print day#day=2012-02-07 (Tuesday) 
+2

Może pomóc: http: // stackoverflow.com/questions/2224742/business-days-in-python –

Odpowiedz

14

użyłbym dateutil.rrule:

import datetime 
from dateutil import rrule 


holidays = [ 
    datetime.date(2012, 5, 1,), 
    datetime.date(2012, 6, 1,), 
    # ... 
] 

# Create a rule to recur every weekday starting today 
r = rrule.rrule(rrule.DAILY, 
       byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR], 
       dtstart=datetime.date.today()) 

# Create a rruleset 
rs = rrule.rruleset() 

# Attach our rrule to it 
rs.rrule(r) 

# Add holidays as exclusion days 
for exdate in holidays: 
    rs.exdate(exdate) 


print rs[0] 
6

To pytanie jest powszechne i istnieją różne poziomy rozwiązań:

Najprostszy: użyć czegoś podobnego swoim podejściu sprawdzenia tygodnia. Jeden wspólny Idom jest coś takiego jak

d = datetime.date(2012,2,7) 
next = d + datetime.timedelta(days= 7-d.weekday() if d.weekday()>3 else 1) 

Gdy chcesz święta, można toczyć własną datetime „TradingDateChecker”, który ma skanować za „przewidywalne” święta jak Jan 1, 4 lipca gru 25 w piątek przed lub Poniedziałek po tych, jeśli wypadną w weekend, w ostatni poniedziałek maja, pierwszy poniedziałek we wrześniu itd.

Nie będę nawet zawracać sobie głowy umieszczaniem tego kodu tutaj, ponieważ na święta handlowe, to wciąż jest niewystarczające.

  • Wielki Piątek NYSE jest zamknięty i futures i rynki obligacji są otwarte
  • Columbus dzień i Dzień Weteranów, banki są zamknięte, a giełda jest otwarta.

Rynki akcji i futures mają różne święta. Jeśli chcesz wakacji NYSE (wspólny wniosek) patrz poniżej. Naprawdę nie da się obejść, zachowując własny kalendarz, ponieważ daty zamknięcia są zwykle ogłaszane tylko na kilka lat w przyszłości.

# For a longer list of NYSE closed dates see: http://www.chronos-st.org/NYSE_Observed_Holidays-1885-Present.html 
holidays = [datetime.date(2000, 1, 17), 
datetime.date(2000, 2, 21), 
datetime.date(2000, 4, 21), 
datetime.date(2000, 5, 29), 
datetime.date(2000, 7, 4), 
datetime.date(2000, 9, 4), 
datetime.date(2000, 11, 23), 
datetime.date(2000, 12, 25), 
datetime.date(2001, 1, 1), 
datetime.date(2001, 1, 15), 
datetime.date(2001, 2, 19), 
datetime.date(2001, 5, 28), 
datetime.date(2001, 7, 4), 
datetime.date(2001, 9, 3), 
datetime.date(2001, 9, 11), 
datetime.date(2001, 9, 12), 
datetime.date(2001, 9, 13), 
datetime.date(2001, 9, 14), 
datetime.date(2001, 11, 22), 
datetime.date(2001, 12, 25), 
datetime.date(2002, 1, 1), 
datetime.date(2002, 1, 21), 
datetime.date(2002, 2, 18), 
datetime.date(2002, 3, 29), 
datetime.date(2002, 5, 27), 
datetime.date(2002, 7, 4), 
datetime.date(2002, 9, 2), 
datetime.date(2002, 11, 28), 
datetime.date(2002, 12, 25), 
datetime.date(2003, 1, 1), 
datetime.date(2003, 1, 20), 
datetime.date(2003, 2, 17), 
datetime.date(2003, 4, 18), 
datetime.date(2003, 5, 26), 
datetime.date(2003, 7, 4), 
datetime.date(2003, 9, 1), 
datetime.date(2003, 11, 27), 
datetime.date(2003, 12, 25), 
datetime.date(2004, 1, 1), 
datetime.date(2004, 1, 19), 
datetime.date(2004, 2, 16), 
datetime.date(2004, 4, 9), 
datetime.date(2004, 5, 31), 
datetime.date(2004, 6, 11), 
datetime.date(2004, 7, 5), 
datetime.date(2004, 9, 6), 
datetime.date(2004, 11, 25), 
datetime.date(2004, 12, 24), 
datetime.date(2005, 1, 17), 
datetime.date(2005, 2, 21), 
datetime.date(2005, 3, 25), 
datetime.date(2005, 5, 30), 
datetime.date(2005, 7, 4), 
datetime.date(2005, 9, 5), 
datetime.date(2005, 11, 24), 
datetime.date(2005, 12, 26), 
datetime.date(2006, 1, 2), 
datetime.date(2006, 1, 16), 
datetime.date(2006, 2, 20), 
datetime.date(2006, 4, 14), 
datetime.date(2006, 5, 29), 
datetime.date(2006, 7, 4), 
datetime.date(2006, 9, 4), 
datetime.date(2006, 11, 23), 
datetime.date(2006, 12, 25), 
datetime.date(2007, 1, 1), 
datetime.date(2007, 1, 2), 
datetime.date(2007, 1, 15), 
datetime.date(2007, 2, 19), 
datetime.date(2007, 4, 6), 
datetime.date(2007, 5, 28), 
datetime.date(2007, 7, 4), 
datetime.date(2007, 9, 3), 
datetime.date(2007, 11, 22), 
datetime.date(2007, 12, 25), 
datetime.date(2008, 1, 1), 
datetime.date(2008, 1, 21), 
datetime.date(2008, 2, 18), 
datetime.date(2008, 3, 21), 
datetime.date(2008, 5, 26), 
datetime.date(2008, 7, 4), 
datetime.date(2008, 9, 1), 
datetime.date(2008, 11, 27), 
datetime.date(2008, 12, 25), 
datetime.date(2009, 1, 1), 
datetime.date(2009, 1, 19), 
datetime.date(2009, 2, 16), 
datetime.date(2009, 4, 10), 
datetime.date(2009, 5, 25), 
datetime.date(2009, 7, 3), 
datetime.date(2009, 9, 7), 
datetime.date(2009, 11, 26), 
datetime.date(2009, 12, 25), 
datetime.date(2010, 1, 1), 
datetime.date(2010, 1, 18), 
datetime.date(2010, 2, 15), 
datetime.date(2010, 4, 2), 
datetime.date(2010, 5, 31), 
datetime.date(2010, 7, 5), 
datetime.date(2010, 9, 6), 
datetime.date(2010, 11, 25), 
datetime.date(2010, 12, 24), 
datetime.date(2011, 1, 17), 
datetime.date(2011, 2, 21), 
datetime.date(2011, 4, 22), 
datetime.date(2011, 5, 30), 
datetime.date(2011, 7, 4), 
datetime.date(2011, 9, 5), 
datetime.date(2011, 11, 24), 
datetime.date(2011, 12, 26), 
datetime.date(2012, 1, 2), 
datetime.date(2012, 1, 16), 
datetime.date(2012, 2, 20), 
datetime.date(2012, 4, 6), 
datetime.date(2012, 5, 28), 
datetime.date(2012, 7, 4), 
datetime.date(2012, 9, 3), 
datetime.date(2012, 11, 22), 
datetime.date(2012, 12, 25), 
datetime.date(2013, 1, 1), 
datetime.date(2013, 1, 21), 
datetime.date(2013, 2, 18), 
datetime.date(2013, 3, 29), 
datetime.date(2013, 5, 27), 
datetime.date(2013, 7, 4), 
datetime.date(2013, 9, 2), 
datetime.date(2013, 11, 28), 
datetime.date(2013, 12, 25)] 
1

inny sposób bez IFS będzie wynosić:

def next_wk_day(): 
    date_today = datetime.datetime.today() 
    shift = 1 + ((date_today.weekday()//4)*(6-date_today.weekday())) 
    return(date_today+shift) 

która działa również w przypadku, gdy robią to w sobotę lub niedzielę.

+4

lub prostsza: 'return date_today + [1, 1, 1, 1, 3, 2, 1] [date_today.weekday()]' Chociaż te formuły ignorują święta. – jfs

1

Użyłem pakietu holidays.

$ pip install holidays 

Oto funkcja, którą wykonałem w celu ustalenia następnego dnia roboczego po dzisiejszym dniu.

import datetime 
import holidays 

ONE_DAY = datetime.timedelta(days=1) 
HOLIDAYS_US = holidays.US() 

def next_business_day(): 
    next_day = datetime.date.today() + ONE_DAY 
    while next_day.weekday() in holidays.WEEKEND or next_day in HOLIDAYS_US: 
     next_day += ONE_DAY 
    return next_day 

Wróci jutro, jeśli jutro nie będzie weekendu, a nie wakacje. W przeciwnym razie znajdzie następny dzień, który nie jest jedną z tych rzeczy. Przykład uruchomić w środę, 15 marca 2017:

>>> next_business_day() 
datetime.date(2017, 3, 16) 

* Uwaga, w przypadku President Camacho deklaruje codziennie wakacje, może to nieskończoną pętlę.

Powiązane problemy