Python中最近的工作日

102 投票
19 回答
209522 浏览
提问于 2025-04-15 19:02

我需要从当前日期中减去一些工作日

我现在有一些代码,它需要始终在最新的工作日运行。所以如果今天是星期一到星期五,那就可以用今天的日期,但如果今天是星期六或星期天,我就需要把日期调整到上一个星期五。我现在的代码有点笨重,实现起来不太方便:

 lastBusDay = datetime.datetime.today()
 if datetime.date.weekday(lastBusDay) == 5:      #if it's Saturday
     lastBusDay = lastBusDay - datetime.timedelta(days = 1) #then make it Friday
 elif datetime.date.weekday(lastBusDay) == 6:      #if it's Sunday
     lastBusDay = lastBusDay - datetime.timedelta(days = 2); #then make it Friday

有没有更好的方法呢?

比如说,我能不能让timedelta只计算工作日,而不是日历上的每一天?

19 个回答

18

也许这段代码能帮到你:

lastBusDay = datetime.datetime.today()
shift = datetime.timedelta(max(1,(lastBusDay.weekday() + 6) % 7 - 3))
lastBusDay = lastBusDay - shift

这个想法是这样的:星期一你需要往回推3天,星期天推2天,其他任何一天推1天。

这句代码 (lastBusDay.weekday() + 6) % 7 的意思是把星期一的起始点从0改成6。

我真的不知道这样做在性能上是否会更好。

28

如果你想跳过美国的假期和周末,这段代码对我有效(我使用的是pandas 0.23.3版本):

import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
US_BUSINESS_DAY = CustomBusinessDay(calendar=USFederalHolidayCalendar())
july_5 = pd.datetime(2018, 7, 5)
result = july_5 - 2 * US_BUSINESS_DAY # 2018-7-2

为了把它转换成Python的日期对象,我这样做:

result.to_pydatetime().date()
192

用pandas库吧!

import datetime
# BDay is business day, not birthday...
from pandas.tseries.offsets import BDay

today = datetime.datetime.today()
print(today - BDay(4))

因为今天是9月26日,星期四,所以你会得到这样的结果:

datetime.datetime(2013, 9, 20, 14, 8, 4, 89761)

撰写回答