【问题标题】:Calculate date 5 days from today, adding an extra day for each day in the next 5 days that is a weekend day计算从今天起 5 天的日期,为接下来的 5 天中的每一天添加一个额外的一天,即周末
【发布时间】:2015-12-30 09:05:02
【问题描述】:

我正在使用 Robot Framework 进行测试,需要创建自己的 Python 关键字。

以当前日期为第 0 天(明天为第 1 天),我试图计算从今天起 5 天后的日期。如果接下来 5 天内的任何一天是星期六,我需要在计算中增加额外的一天。如果任何一天是星期日,则相同。

作为一名 Python 初学者,我有点不了解,因此非常感谢任何帮助

【问题讨论】:

  • 在这种情况下,SA/SU 增加 5 天和 1 天实际上与增加一整周(7 天)不一样吗?如果您不需要任何通用的东西,您可以使用 dt + timedelta(days=7) 简单地添加 7 天
  • 星期一除外。然后你只需返回Friday
  • 从星期一开始的第 5 天是星期六。

标签: python robotframework


【解决方案1】:

基本上你需要增加 5 个工作日...应该这样做:

import datetime
def addBusinessDays(from_date, add_days):
    business_days_to_add = add_days
    current_date = from_date
    while business_days_to_add > 0:
        current_date += datetime.timedelta(days=1)
        weekday = current_date.weekday()
        if weekday >= 5: # sunday = 6
            continue
        business_days_to_add -= 1
    return current_date

#demo:
print '5 business days from today:'
print addBusinessDays(datetime.date.today(), 5)

更新:

解释如下:

  1. 我们得到开始日期(我们需要添加工作日的日期)
  2. 我们使用循环一次将第 1 天添加到日期(我们使用 datetime.timedelta(days=1) 将 1 天添加到日期)
  3. 添加每一天后,我们检查更新日期是否为工作日。如果是工作日,我们计算它,否则我们不计算它并继续

【讨论】:

  • 能多解释一些就好了,初学者也能看懂。
【解决方案2】:

你可以用数学方法做到:

from datetime import timedelta

def business_days(date, days):
    if days == 0:
        return date
    day = date.weekday()
    if day in (5, 6):
        date += timedelta(days=7 - day)
        days -= 1
    date += timedelta(days=days / 5 * 7)
    return date + timedelta(days=days % 5)

从您传入的任何日期或之后的任何日期,都可以获取日期 n 个工作日:

In [6]: dte = datetime.datetime.today()

In [7]: business_days(dte, 5)
Out[7]: datetime.datetime(2016, 1, 6, 11, 28, 38, 264331)

In [8]: business_days(dte, -5)
Out[8]: datetime.datetime(2015, 12, 23, 11, 28, 38, 264331)

【讨论】:

    【解决方案3】:

    如果您想处理大量时间序列,请查看pandas。添加五个工作日非常简单:

    from datetime import datetime
    import pandas as pd
    
    today = datetime.today()
    then = today + pd.tseries.offsets.BDay(5)
    

    【讨论】:

      【解决方案4】:

      使用 NumPy,您可以使用 np.busday_offset 查找加或减工作日:

      由于2016-03-27 是星期日,前滚返回第一个有效工作日2016-03-28

      import numpy as np
      np.busday_offset('2016-03-27', 0, roll='forward')
      # numpy.datetime64('2016-03-28')
      

      要获取datetime 对象,请调用item()

      np.busday_offset('2016-03-27', 0, roll='forward').item()
      # datetime.date(2016, 3, 28)
      

      要提前 5 个工作日,请将第二个参数更改为 5:

      np.busday_offset('2016-03-27', 5, roll='forward').item()
      # datetime.date(2016, 4, 4)
      

      要返回 5 个工作日,请使用负偏移量和 roll='backward':

      np.busday_offset('2016-03-27', -5, roll='backward').item()
      # datetime.date(2016, 3, 18)
      
      np.busday_offset('2016-03-28', -5, roll='backward').item()
      # datetime.date(2016, 3, 21)
      

      这是一个供参考的日历:

            March 2016               April 2016         
       Su Mo Tu We Th Fr Sa     Su Mo Tu We Th Fr Sa    
              1  2  3  4  5                     1  2    
        6  7  8  9 10 11 12      3  4  5  6  7  8  9    
       13 14 15 16 17 18 19     10 11 12 13 14 15 16    
       20 21 22 23 24 25 26     17 18 19 20 21 22 23    
       27 28 29 30 31           24 25 26 27 28 29 30    
      

      【讨论】:

      • 非常详细和简单的解释。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-11-02
      • 2020-11-08
      • 1970-01-01
      相关资源
      最近更新 更多