2012-02-08 19 views
8

Due problemi correlati: (1) Tutti i dati con cui lavoro hanno date di giorni della settimana allegate. In vari punti, ho bisogno di sapere qual è il prossimo giorno della settimana. Ho scritto qualcosa come il codice qui sotto per rendere questa determinazione, ma sono sicuro che c'è un modo migliore. Chiunque? (2) Idealmente, ho bisogno di sapere non solo il prossimo giorno della settimana, ma il prossimo giorno lavorativo degli Stati Uniti - che è il prossimo giorno della settimana che non è un mercato statunitense. Qualsiasi aiuto su questo sarebbe anche grandioso.Datetime Python - Giorno lavorativo successivo

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

Potrebbe aiutare: http: // StackOverflow.com/domande/2224742/Commercio-giorni-di-python –

risposta

14

vorrei utilizzare 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

Questa domanda è comune e ci sono diversi livelli di soluzioni:

più semplice: usare qualcosa come il vostro approccio di controllare il giorno della settimana. Un'IDOM comune è qualcosa di simile a

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

Una volta che si desidera vacanze, si può rotolare il proprio datetime "TradingDateChecker" che deve eseguire la scansione per le vacanze "prevedibile" come Jan 1, 4 luglio 25 dicembre il Venerdì prima o Lunedì dopo quelli se cadono in un fine settimana, lunedì scorso in maggio, primo lunedì in settembre ecc.

Non mi preoccuperò nemmeno di postare quel codice qui perché per le vacanze di trading, è ancora insufficiente.

  • Venerdì Santo il NYSE è chiuso e futures e mercati obbligazionari sono aperti
  • Columbus Day e Veterans Day, le banche sono chiuse e il mercato azionario è aperto.

I mercati delle azioni e dei futures hanno festività diverse. Se vuoi le vacanze NYSE (una richiesta comune) vedi sotto. Non si può davvero andare in giro mantenendo il proprio calendario poiché le date di chiusura di solito vengono annunciate solo per un paio d'anni in futuro.

# 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

un altro modo senza se sarebbe:

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

che sarebbe anche lavorare nel caso in cui si sta facendo su un Sabato o Domenica.

+4

o più semplice: 'date_today ritorno + [1, 1, 1, 1, 3, 2, 1] [date_today.weekday()]' Anche se queste formule ignorano vacanze. – jfs

1

Ho utilizzato il pacchetto holidays.

$ pip install holidays 

Ecco la funzione che ho effettuato per determinare il giorno lavorativo successivo a oggi.

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 

Tornerà la data di domani, se domani non è un fine settimana e non è una vacanza. Altrimenti troverà il prossimo giorno * che non è neanche una di quelle cose. Esempio eseguito su Mercoledì 15 Marzo 2017:

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

* Attenzione, in caso President Camacho dichiara ogni giorno una vacanza, questo potrebbe Infinite Loop.

Problemi correlati