确定一天是不是是 Python / Pandas 中的工作日

Posted

技术标签:

【中文标题】确定一天是不是是 Python / Pandas 中的工作日【英文标题】:Determine if a day is a business day in Python / Pandas确定一天是否是 Python / Pandas 中的工作日 【发布时间】:2016-12-28 07:15:00 【问题描述】:

我目前有一个程序设置来运行两种不同的方式。一种方法是在指定的时间范围内运行,另一种方法是每天运行。但是,当我将它设置为每天运行时,我只希望它在工作日继续运行。现在通过研究,我发现您可以像这样使用 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() 来做我正在寻找的东西,但在我看来这会很草率而且不直观。我觉得必须有一个更简单的解决方案。有什么建议吗?

【问题讨论】:

任务中最困难的部分是定义工作日是什么。它可能因国家而异,在极少数情况下甚至因村庄而异。 感谢 Klaus D 的评论。我想补充一些细节:这个程序是针对美国工作日的。特别是市场(纽约证券交易所、纳斯达克等)开放和股票交易发生的日子 请查看此模块。它可能会帮助你。 pypi.python.org/pypi/bdateutil/0.1 那么,这些日子是如何定义的?如果你有答案,你只需要把它放在一个函数中。 也请检查此链接 - ***.com/questions/2224742/business-days-in-python 【参考方案1】:

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

   bdays=BDay()
   def is_business_day(date):
       return date == date + 0*bdays

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

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

【讨论】:

【参考方案2】:

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

对于 Pandas 版本

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


bdays=BDay()
is_business_day = bday.onOffset(date(2020,8,20))

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

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


bdays=BDay()
is_business_day = bday.is_on_offset(date(2020,8,20))

【讨论】:

【参考方案3】:

对我来说,我使用 Excel 中的一个老技巧:

from pandas.tseries.offsets import Day, BDay

def is_bday(x):
    return x == x + Day(1) - BDay(1)

【讨论】:

【参考方案4】:

至少使用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")

【讨论】:

【参考方案5】:

请查看此模块 - bdateutil

请使用上述模块检查以下代码:

from bdateutil import isbday
from datetime import datetime,date
now = datetime.now()
val = isbday(date(now.year, now.month, now.day))
print val

如果有帮助,请告诉我。

【讨论】:

【参考方案6】:

由于lenpd.bdate_range() 告诉我们提供的日期范围内有多少个工作日,我们可以将其转换为bool 以确定单日范围是否为工作日:

def is_business_day(date):
    return bool(len(pd.bdate_range(date, date)))

【讨论】:

以上是关于确定一天是不是是 Python / Pandas 中的工作日的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?

python pandas 按一天中的小时求和

如何在 pandas/python 中查看 excel 电子表格的公式?

如何确定 Pandas 列是不是包含特定值

如何确定 Pandas/NumPy 中的列/变量是不是为数字?

数学建模学习笔记集训十天之第一天