Python中最近的工作日
我需要从当前日期中减去一些工作日。
我现在有一些代码,它需要始终在最新的工作日运行。所以如果今天是星期一到星期五,那就可以用今天的日期,但如果今天是星期六或星期天,我就需要把日期调整到上一个星期五。我现在的代码有点笨重,实现起来不太方便:
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)