【问题标题】: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
  • 那么,这些日子是如何定义的?如果你有答案,你只需要把它放在一个函数中。

标签: python date datetime pandas


【解决方案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)))
            

            【讨论】:

              猜你喜欢
              • 2015-06-03
              • 2020-02-24
              • 2015-06-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-11
              • 2013-09-01
              • 1970-01-01
              相关资源
              最近更新 更多