我需要从当前日期减去工作日 .
我目前有一些代码需要始终在最近的工作日运行 . 因此,如果我们在星期六或星期日这可能是今天,那么我需要将它设置回周末前的星期五 . 我目前有一些漂亮的 clunky 代码来执行此操作:
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在工作日而不是日历日工作吗?
9 回答
用熊猫!
从今天是9月26日星期四,这将给你一个输出:
如果您愿意安装额外的库,似乎有几种选择 .
这篇文章描述了一种使用dateutil定义工作日的方法 .
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html
BusinessHours允许您自定义您的假期列表等,以定义您的工作时间(以及延长工作日) .
http://pypi.python.org/pypi/BusinessHours/
DISCLAMER: 我是作者......
我写了一个包,它完成了这个,业务日期计算 . 您可以使用自定义周规格和假期 .
我在使用财务数据时遇到了这个问题,并且没有找到任何可用的解决方案特别容易,所以我写了一个 .
希望这对其他人有用 .
https://pypi.python.org/pypi/business_calendar/
也许这段代码可以帮助:
这个想法是,在星期一,你必须回到3天,在星期日2和1在任何其他日子 .
声明
(lastBusDay.weekday() + 6) % 7
只是将周一从0改为6 .真的不知道这在性能方面是否会更好 .
timeboard包这样做 .
假设您的日期是2017年9月4日 . 尽管是星期一,但这是在美国度假(劳动节) . 因此,最近的工作日是9月1日星期五 .
在英国,2017年9月4日是正常工作日,因此最近的工作日本身就是如此 .
免责声明:我是时间板的作者 .
如果你想跳过美国假期和周末,这对我有用(使用pandas 0.23.3):
要转换为python日期对象,我这样做:
这将给出一个工作日的生成器,当然没有假期,stop是datetime.datetime对象 . 如果您需要假期,只需在假期列表中添加其他参数并查看“IFology”;-)
以后你可以算一下
你为什么不尝试这样的事情: