我目前有一个程序设置以两种不同的方式运行。一种方法是在指定的时间范围内跑步,另一种方法是每天跑步。然而,当我将它设置为每天运行时,我只希望它在工作日继续运行。现在,从研究中我看到,您可以像这样使用Pandas来迭代工作日:
start = 2016-08-05
end = datetime.date.today().strftime("%Y-%m-%d")
for day in pd.bdate_range(start, end):
print str(day) + " is a business Day"
当我在指定的时间内运行我的程序时,这工作得很好。
但是,当我想让程序每天运行时,我不太清楚如何将特定的一天作为工作日进行测试。基本上我想这样做:
start = datetime.date.today().strftime("%Y-%m-%d")
end = datetime.date.today().strftime("%Y-%m-%d")
if start == end:
if not Bdate(start)
print "Not a Business day"
我知道我可能可以设置pd.bdate_range()来做我正在寻找的东西,但在我看来,这将是草率和不直观的。我觉得肯定有更简单的解决办法。任何建议吗?
由于pd.bdate_range()
的len
告诉我们提供的日期范围中有多少个工作日,我们可以将其转换为bool
以确定单个天的范围是否为工作日:
def is_business_day(date):
return bool(len(pd.bdate_range(date, date)))
我刚刚找到了一个不同的解决方案。如果你想找到下一个工作日,而你的约会不是工作日,这可能会很有趣。
bdays=BDay()
def is_business_day(date):
return date == date + 0*bdays
添加0*bdays
在包括当前工作日在内的下一个工作日前滚。不幸的是,减去0*bdays
不能向后滚(至少对于我使用的pandas版本)。
此外,由于这种行为,您也需要小心,因为不一定0*bdays + 1*bdays != 1*bdays
在pandas中有一个内置的方法。
For Pandas version <1.0
from pandas.tseries.offsets import Day, BDay
from datetime import datetime
bday=BDay()
is_business_day = bday.onOffset(datetime(2020,8,20))
For Pandas version>=1.1.0 (onOffset
已弃用)
from pandas.tseries.offsets import Day, BDay
from datetime import datetime
bday=BDay()
is_business_day = bday.is_on_offset(datetime(2020,8,20))
至少使用numpy
1.7.0版本。,试试np.is_busday()
start = datetime.date.today().strftime("%Y-%m-%d")
end = datetime.date.today().strftime("%Y-%m-%d")
if start == end:
# added code here
if not np.is_busday(start):
print("Not a Business day")
对于我来说,我使用了Excel中的一个老技巧:
from pandas.tseries.offsets import Day, BDay
def is_bday(x):
return x == x + Day(1) - BDay(1)
请查看此模块- bdateutil
请使用上面的模块检查下面的代码:
from bdateutil import isbday
from datetime import datetime,date
now = datetime.now()
val = isbday(date(now.year, now.month, now.day))
print val
如果有帮助,请告诉我。