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可让您自定义假期列表等,以定义您的工作时间(以及延长工作日)的时间。
免责声明:我是作者…
我写了一个包,完成这个,商业date的计算。 您可以使用自定义星期规格和假期。
我在处理财务数据时遇到了这个确切的问题,没有find任何可用的解决scheme,特别容易,所以我写了一个。
希望这对其他人有用。
也许这个代码可以帮助:
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