在Python中查找一个月的最后一个工作日

问题描述 投票:0回答:9

我正在尝试查找该月的最后一个工作日。我为此编写了下面的代码,它工作得很好,但我想知道是否有更干净的方法来做到这一点?

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)

提前致谢!

python datetime calendar
9个回答
34
投票

我使用以下内容:

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)

9
投票

对于单线粉丝:

import calendar

def last_business_day_in_month(year: int, month: int) -> int:
    return max(calendar.monthcalendar(year, month)[-1][:5])

8
投票

假设您想要获取该月的最后一个工作日,直到未来两年的年底,以下方法都可以。

   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')

2
投票

我在该月的第一个工作日使用它,但也可以在该月的最后一个工作日使用:

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]

我在那里留下了一些当月最后一个工作日不需要的代码,但可能对某人有用。


0
投票

您可以使用

Pandas
获取工作日。请参阅 http://pandas.pydata.org/pandas-docs/stable/timeseries.html

您也可以参考这个https://pypi.python.org/pypi/business_calendar/进行简单的工作日计算。


0
投票

使用前滚(d),如果日期超过了当月的最后一个工作日,您将跳到下个月,因此对于该月的任何一天来说,以下内容可能更安全:

from datetime import date
import pandas as pd

d = date(2011, 12, 31) # a caturday
pd.bdate_range(end=pd.offsets.MonthEnd().rollforward(d), periods=1)
pd.offsets.BMonthEnd().rollforward(d)

0
投票

我需要一些直观可读的东西并选择以下内容:

from datetime import datetime, timedelta
import pandas as pd

def isMonthLastBusinessDay(date):
    lastDayOfMonth = date + pd.offsets.MonthEnd(0)
    isFriday = date.weekday() == 4
    if (date.weekday() < 5 and lastDayOfMonth == date) or (isFriday and lastDayOfMonth == date+timedelta(days=1)) or (isFriday and lastDayOfMonth == date+timedelta(days=2)):
        return True
    else:
        return False

0
投票

对 @Elke 的答案进行轻微升级,因为今天实际上是月底,以确保它不会滚动:

run_date = pd.Timestamp('2023-07-31')

run_date.replace(day=1) + pd.offsets.BMonthEnd()
Out[27]: Timestamp('2023-07-31 00:00:00')

run_date.replace(day=1) - pd.offsets.BMonthEnd()
Out[28]: Timestamp('2023-06-30 00:00:00')

0
投票

这里还有一个广义函数

def is_last_day_in_period(date, freq='bm'):
""" Checks if particular date is last date of a specific period

e.g. 'm', 'bm', 'q', 'bq', 'a', 'ba'

Parameters
----------
date : datelike
    date to evaluate
freq : str
    valid pandas frequency string

Returns
-------
check : bool
    if last day in period
"""

date = pd.Timestamp(date)
int_dates = pd.date_range(start=date, end=date + Day(1000), freq=freq)
check = int_dates[int_dates >= date][0] == date

return check
© www.soinside.com 2019 - 2024. All rights reserved.