确定一天是不是是 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.0(onOffset
已弃用)
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】:由于len
的pd.bdate_range()
告诉我们提供的日期范围内有多少个工作日,我们可以将其转换为bool
以确定单日范围是否为工作日:
def is_business_day(date):
return bool(len(pd.bdate_range(date, date)))
【讨论】:
以上是关于确定一天是不是是 Python / Pandas 中的工作日的主要内容,如果未能解决你的问题,请参考以下文章
Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?
如何在 pandas/python 中查看 excel 电子表格的公式?