2012-02-08 17 views
8

İki ilgili sorun: (1) Çalıştığım tüm veriler hafta içi günlere bağlı. Çeşitli noktalarda, önümüzdeki hafta içi ne olduğunu bilmem gerek. Bu kararlılığı sağlamak için aşağıdaki kod gibi bir şey yazdım, ama eminim ki daha iyi bir yol var. Kimse? (2) İdeal olarak, sadece önümüzdeki hafta günü değil, bir sonraki ABD iş günü'u bilmem gerek. Bu, önümüzdeki hafta içi bir ABD pazar tatili değil. Bu konuda herhangi bir yardım da harika olurdu.Datetime Python - Sonraki İş Günü

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

Might help: http: // stackoverflow.com/questions/2224742/business-days-in-python –

cevap

14

Ben dateutil.rrule kullanırsınız:

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

Bu soru yaygındır ve çözümlerin farklı seviye vardır:

En basit: hafta içi kontrol etme gibi bir yaklaşım gibi bir şey kullanın. Yaygın IDOM size tatil istiyorum sonra, önce Cuma Jan 1, 4 Temmuz Dec 25 gibi "öngörülebilir" tatil için tarama vardır kendi datetime "TradingDateChecker" rulo veya edebilirsiniz

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

gibi bir şey Pazartesi gününden sonra, eğer bir haftasonuna düşerlerse, son pazartesi Mayıs ayında, ilk pazartesi Eylül'de vb.

Bu kodu buraya göndermekten rahatsız olmayacağım çünkü ticaret tatilleri için hala yetersiz.

  • Kutsal Cuma NYSE kapalıdır ve vadeli ve tahvil piyasaları
  • Columbus günü ve Gaziler Günü açıktır, bankalar kapalı ve borsa açıktır edilir.

Hisse senedi ve vadeli işlem piyasaları farklı tatillere sahiptir. NYSE tatillerini istiyorsanız (ortak bir istek) aşağıya bakın. Kapanış tarihleri ​​genellikle sadece birkaç yıl için duyurulduğundan beri kendi takviminizi saklayamazsınız. IFS olurdu olmadan

# 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

başka bir yol:

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

da durumda çalışacak bir Cumartesi veya Pazar günü bunu yapıyor.

+4

veya daha basit: 'return date_today + [1, 1, 1, 3, 2, 1] [date_today.weekday()]' Bu formüller tatilleri görmezden gelse de. – jfs

1

holidays paketini kullandım. İşte

$ pip install holidays 

Ben bugünden sonra bir sonraki iş günü belirlemek için yapılmıştır işlevidir.

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 

Yarın haftasonu değilse ve tatil değilse, yarının tarihine dönecektir. Aksi takdirde, bunlardan biri olmayan sonraki * gününü bulacaktır. Örnek, Çarşamba günü 15 Mart 2017 çalıştırın:

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

* Dikkat, olay President Camacho yılında her gün bir tatil beyan, bu döngü sonsuza olabilir.

İlgili konular