2016-05-25 4 views
3

Я пытаюсь найти последний рабочий день месяца. Я написал код ниже для этого, и он отлично работает, но мне было интересно, есть ли более чистый способ сделать это?нахождение последнего рабочего дня месяца в python

from datetime import date,timedelta 
import datetime 
import calendar 

today=datetime.date.today() 

last = today.replace(day=calendar.monthrange(today.year,today.month)[1]) 

if last.weekday()<5: 
    print last 

else: 
    print last-timedelta(days=1+last.weekday()-5) 

Заранее благодарен!

+0

здесь [код для последнего рабочего дня следующего месяца] (http://stackoverflow.com/a/29783682/4279). Если вы хотите учесть праздники; вам нужна база данных для данной страны, например [праздники] (https://pypi.python.org/pypi/holidays) (я не знаю, насколько она полна или обновлена). – jfs

+0

связанных: [Рабочие дни на Python] (http://stackoverflow.com/q/2224742/4279) – jfs

ответ

4

Я использую следующие:

from pandas.tseries.offsets import BMonthEnd 
from datetime import date 

d=date.today() 

offset = BMonthEnd() 

#Last day of current month 
offset.rollforward(d) 

#Last day of previous month 
offset.rollback(d) 
1

Допустим, вы хотите получить последние рабочие дни месячника вверх до конца на ближайшие два года, следующие будут работать.

import pandas as pd 
    import datetime 

    start = datetime.date.today() 
    end = datetime.date(start.year+2, 12, 31) 
    bussiness_days_rng =pd.date_range(start, end, freq='BM') 
0

Я использую это в первый рабочий день месяца, но он может быть использован для последнего рабочего дня месяца, а:

import time 
import datetime 
from pandas.tseries.holiday import USFederalHolidayCalendar 
from pandas.tseries.offsets import CustomBusinessDay 
from dateutil.relativedelta import relativedelta 

#Create dates needed to be entered as parameters 
today = datetime.date.today() 
first = today.replace(day=1) 
#End of the Prior Month 
eopm = first - datetime.timedelta(days=1) 
eopm = eopm.strftime("%Y%m%d") 
#Create first business day of current month date 
us_bd = CustomBusinessDay(calendar=USFederalHolidayCalendar()) 
focm = first 
nxtMo = today + relativedelta(months=+1) 
fonm = nxtMo.replace(day=1) 
eocm = fonm - datetime.timedelta(days=1) 
first_bd = pd.DatetimeIndex(start = focm, end = eocm, freq= us_bd) 
first_bd = first_bd.strftime("%Y%m%d") 
#First Business Day of the Month 
first_bd = first_bd[0] 
#Last Business Day of the Month 
lst_day = len(first_bd)-1 
last_bd = first_bd[lst_day] 

я оставил некоторый код там не нужен за последний рабочий день текущего месяца, но может быть полезен кому-то.