【问题标题】:Capturing Holiday when computing 3 business days prior from given date从给定日期计算前 3 个工作日时捕获假期
【发布时间】:2019-11-14 05:55:08
【问题描述】:

假设我们有一个日期为2019-11-19,即星期二。现在我想从星期二开始返回 3 个工作日,即我想得到2019-11-15,因为 16 日和 17 日分别是星期六和星期日。为此,我有以下代码:

dt_tue = datetime.strptime('2019-11-19','%Y-%m-%d')
bd-3 = dt_tue - timedelta(days=3)    #<--- 3 business days prior
for i in range(bd_3.day,dt_tue.day+1):
  dt_in = datetime(dt_tue.year,dt_tue.month,i)
  if dt_in.weekday() > 5:
    bd_3 = dt_tue - timedelta(4)

上面的代码生成 bd_3 为 2019 年 11 月 15 日,即星期五,这是正确的。

我想在上面的代码中处理假期(数据框中提供)。例如,如果dt_in 是在任何假期(包括bd_3dt_tue),那么bd_3 应该是11 月14 日。除了Holiday 是在周六或周日,那么bd_3 应该只是11 月15 日。

任何机构都可以投一些光吗?假设假期数据框如下所示:

    Date                 Holiday_name           Day
January 1, 2019         New Year's Day        Tuesday
January 21, 2019      Martin Luther King Day  Monday
February 18, 2019     Presidents' Day*        Monday
May 27, 2019             Memorial Day         Monday

【问题讨论】:

  • 星期二不是星期四前 3 个工作日吗?
  • 不包括星期二是星期五。
  • 您是否尝试过以星期四或星期五作为开始日?我相信你会发现那些分别出现在星期一或星期二,这不符合那个逻辑
  • 好的,明白了。然后我需要解决这个问题。很高兴你能帮我把假期包括在内。
  • 我想如果我将 bd_3 设置为 dt - timedelta(days=2) 这个问题会得到解决。但是,对于周六和周日,这应该是脚本中提到的 timedelta(days=4)

标签: python


【解决方案1】:

反正你整天都在忙于循环,我建议你做一个简单的备份,并在你去的时候检查每一天,比如:

dt_tue = datetime.strptime('2019-11-19','%Y-%m-%d')
current_day = dt_tue
days_before = 0
while days_before < 2:
    # Skip weekends and holiday (without counting as a business day)
    while current_day.weekday() >= 5 or current_day in df['Date']:
        current_day -= timedelta(days=1)
    # Step back a business day
    current_day -= timedelta(days=1)
    days_before += 1
bd_3 = current_day

您可能需要稍微调整一下,因为我不能 100% 确定您的假期数据框的格式。

【讨论】:

  • 请检查日期2019-10-14 。这是星期一和美国假期。根据您的逻辑,bd_3datetime.datetime(2019, 10, 11, 0, 0) 的形式出现,即 10 月 11 日是星期五。这是不正确的。
  • 好的,我已经修复了工作日条件(应该是&gt;= 5,而不是&gt; 5),但是由于我不知道您的数据框是如何格式化的,所以检查它的条件可能是错误的。因此,我对您需要相应调整它的评论
  • 如果您展示数据框的实际格式,那将有很大帮助
  • @Ixop:我已经用假期数据框更新了这个问题。
  • 我没有在此处安装pandas 来验证我的代码,但我已将条件更新为我认为应该工作的条件。你应该能够自己解决剩下的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多