Python中的营业日

我需要从当前date减去工作日

我目前有一些代码需要在最近的工作日始终运行。 如果我们是星期一到星期五,今天可能是今天,但是如果是星期六或星期天,那么我需要把它设置回周末前的星期五。 我目前有一些非常笨重的代码来做到这一点:

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工作在平日而不是日历天吗?

使用pandas!

 import pandas as pd # BDay is business day, not birthday... from pandas.tseries.offsets import BDay # pd.datetime is an alias for datetime.datetime today = pd.datetime.today() print today - BDay(4) 

由于今天是9月26日星期四,这会给你一个输出:

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

似乎有几个选项,如果你打开安装额外的库。

这篇文章描述了一个用dateutil定义工作日的方法 。

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html

BusinessHours可让您自定义假期列表等,以定义您的工作时间(以及延长工作日)的时间。

http://pypi.python.org/pypi/BusinessHours/

免责声明:我是作者…

我写了一个包,完成这个,商业date的计算。 您可以使用自定义星期规格和假期。

我在处理财务数据时遇到了这个确切的问题,没有find任何可用的解决scheme,特别容易,所以我写了一个。

希望这对其他人有用。

https://pypi.python.org/pypi/business_calendar/

也许这个代码可以帮助:

 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。

真的不知道这是否会在performance上更好。

这会产生一个工作日,当然没有节假日,stop是datetime.datetime对象。 如果你需要假期,只需要与假期列表进行额外的争论,并检查“IFology”;-)

 def workingdays(stop, start=datetime.date.today()): while start != stop: if start.weekday() < 5: yield start start += datetime.timedelta(1) 

稍后你可以数他们

 workdays = workingdays(datetime.datetime(2015, 8, 8)) len(list(workdays)) 

你为什么不尝试这样的:

 lastBusDay = datetime.datetime.today() if datetime.date.weekday(lastBusDay) not in range(0,5): lastBusDay = 5 
  def getNthBusinessDay(startDate, businessDaysInBetween): currentDate = startDate daysToAdd = businessDaysInBetween while daysToAdd > 0: currentDate += relativedelta(days=1) day = currentDate.weekday() if day < 5: daysToAdd -= 1 return currentDate