确定Python/Pandas中的某一天是否是营业日

Jus*_*tin 7 python datetime date pandas

我目前有一个程序设置,以两种不同的方式运行.一种方法是在指定的时间范围内运行,另一种方法是每天运行.但是,当我将它设置为每天运行时,我只希望它在一个工作日继续运行.现在从研究中我已经看到你可以使用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"
Run Code Online (Sandbox Code Playgroud)

当我在指定的时间段内运行程序时,这非常有用.

但是,当我想每天运行该程序时,我无法弄清楚如何测试一个特定的日子作为工作日.基本上我想做这样的事情:

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"
Run Code Online (Sandbox Code Playgroud)

我知道我可以设置pd.bdate_range()来做我正在寻找的东西,但在我看来会很草率而且不直观.我觉得必须有一个更简单的解决方案.有什么建议?

Zev*_*ach 12

由于lenpd.bdate_range()告诉我们,天有多少企业在日期的供应范围,我们可以投这一个bool,以确定是否一个范围是一天是工作日:

def is_business_day(date):
    return bool(len(pd.bdate_range(date, date)))
Run Code Online (Sandbox Code Playgroud)


Qui*_*2k1 7

我刚刚找到了一个不同的解决方案。如果您想查找下一个工作日(如果您的日期不是工作日),这可能会很有趣。

   bdays=BDay()
   def is_business_day(date):
       return date == date + 0*bdays
Run Code Online (Sandbox Code Playgroud)

添加会0*bdays向前滚动到下一个工作日(包括当前工作日)。不幸的是,减法0*bdays不会向后滚动(至少对于我使用的 pandas 版本)。

此外,由于这种行为,您也需要小心,因为不一定 0*bdays + 1*bdays != 1*bdays


Rag*_*nya 6

pandas 有内置方法可以做到这一点。

对于 Pandas 版本 <1.0

from pandas.tseries.offsets import Day, BDay
from datetime import datetime


bday=BDay()
is_business_day = bday.onOffset(datetime(2020,8,20))
Run Code Online (Sandbox Code Playgroud)

对于 Pandas 版本 >=1.1.0onOffset已弃用)

from pandas.tseries.offsets import Day, BDay
from datetime import datetime


bday=BDay()
is_business_day = bday.is_on_offset(datetime(2020,8,20))
Run Code Online (Sandbox Code Playgroud)