2012-02-08 65 views
8

Hai vấn đề liên quan: (1) Tất cả dữ liệu tôi làm việc có ngày trong tuần được đính kèm. Tại các điểm khác nhau, tôi cần phải biết ngày trong tuần tiếp theo là gì. Tôi đã viết một cái gì đó giống như mã dưới đây để thực hiện quyết tâm này, nhưng tôi chắc chắn có một cách tốt hơn. Bất kỳ ai? (2) Lý tưởng nhất, tôi cần phải biết không chỉ vào các ngày trong tuần tiếp theo, nhưng ngày làm việc tiếp theo của Hoa Kỳ - đó là, các ngày trong tuần tiếp theo không phải là kỳ nghỉ tại thị trường Mỹ. Bất kỳ trợ giúp về điều này cũng sẽ là tuyệt vời.Ngày giờ Python - Ngày làm việc tiếp theo

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

Có thể trợ giúp: http: // stackoverflow.com/questions/2224742/business-days-in-python –

Trả lời

14

Tôi sẽ sử dụng 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

Câu hỏi này là phổ biến và có những cấp độ khác nhau của giải pháp:

đơn giản: sử dụng giống như cách tiếp cận của bạn kiểm tra các ngày trong tuần. Một IDOM chung là cái gì đó như

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

Khi bạn muốn ngày lễ, bạn có thể cuộn datetime của riêng bạn "TradingDateChecker" mà đã quét cho những ngày nghỉ "dự đoán" như 1 tháng 1, tháng 4, ngày 25 tháng mười hai ngày thứ Sáu trước hoặc Thứ hai sau ngày đó, nếu họ rơi vào cuối tuần, Thứ Hai tuần trước vào tháng 5, thứ Hai đầu tiên vào tháng 9, v.v.

Tôi thậm chí sẽ không đăng mã đó vì các ngày lễ, vẫn không đủ.

  • Good Friday NYSE được đóng lại và tương lai và thị trường trái phiếu đang mở
  • Columbus ngày và Ngày Cựu chiến binh, các ngân hàng đều đóng cửa và thị trường chứng khoán đang mở.

Thị trường chứng khoán và kỳ hạn có ngày nghỉ khác nhau. Nếu bạn muốn ngày nghỉ NYSE (một yêu cầu chung) xem bên dưới. Bạn có thể không thực sự có được xung quanh giữ lịch của riêng bạn kể từ ngày kết thúc thường chỉ được công bố trong một vài năm trong tương lai.

# 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

một cách khác mà không IFS sẽ là:

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

mà cũng sẽ làm việc trong trường hợp bạn đang làm việc đó vào ngày Thứ Bảy hoặc Chủ Nhật.

+4

hoặc đơn giản hơn: 'return date_today + [1, 1, 1, 1, 3, 2, 1] [date_today.weekday()]' Mặc dù các công thức này bỏ qua ngày lễ. – jfs

1

Tôi đã sử dụng gói holidays.

$ pip install holidays 

Đây là hàm tôi đã thực hiện để xác định ngày làm việc tiếp theo sau ngày hôm nay.

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 

Nó sẽ trả về ngày mai, nếu ngày mai không phải là ngày cuối tuần và không phải là ngày lễ. Nếu không, nó sẽ tìm thấy * ngày tiếp theo không phải là một trong những điều đó. Ví dụ chạy trên Thứ Tư 15 Tháng Ba, 2017:

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

* Chú ý, trong trường hợp President Camacho tuyên bố mỗi ngày một kỳ nghỉ, điều này có thể lặp vô hạn định.

Các vấn đề liên quan