【问题标题】:getting the date for next weekday获取下一个工作日的日期
【发布时间】:2014-09-30 15:25:23
【问题描述】:

我正在检查当前日期是否是工作日,如果不是,我想获得下一个工作日。工作日是从星期一到星期五。

这是我尝试过的:

import time
from datetime import date,timedelta
dmy=time.strftime("%d-%m-%Y")# getting the current date 
if dmy.strftime("%w") in set([6,7]): # checking if its a weekend( Sat/Sun) , if so advancing
    dmy=time.strftime("%d-%m-%Y")+ timedelta(days=dmy.strftime("%w")%5) # this statement is not working, it errors out .  

dmy=time.strftime("%d-%m-%Y")+ timedelta(days=dmy.strftime("%w")%5)) 语句不起作用。前进到下一个工作日的最简单方法是什么?

【问题讨论】:

    标签: python date


    【解决方案1】:

    您应该使用实际的 date 对象,而不是字符串:

    >>> import datetime
    >>> today = datetime.date.today()
    >>> if today.isoweekday() in set((6, 7)):
        today += datetime.timedelta(days=today.isoweekday() % 5)
    
    
    >>> today
    datetime.date(2014, 9, 30)
    

    请注意,isoweekday1(星期一)到 7(星期日),而 weekday06


    另外,请注意,您的逻辑目前在周六和周日增加了一天,这是不正确的 - 我认为您想要:

    >>> if today.isoweekday() in set((6, 7)):
        today += datetime.timedelta(days=8 - today.isoweekday())
    

    例如:

    >>> day = datetime.date(2014, 10, 4)
    >>> day
    datetime.date(2014, 10, 4) # Saturday
    >>> if day.isoweekday() in set((6, 7)):
        day += datetime.timedelta(days=8 - day.isoweekday())
    
    
    >>> day
    datetime.date(2014, 10, 6) # Monday
    

    【讨论】:

    • 现在时间已经过去了,我正在考虑编辑您的答案@jonrsharpe 仅仅是因为它从更正不正确的代码开始,这可能会导致半读和应用建议的感知力降低。虽然我同意在某种程度上不阅读是他们自己的错,但简单地包含答案可能会有所帮助,因此不需要上下文来查看答案应该是什么。
    • set((6,7)) 中缺少5
    • @GustavoLouisG.Montańo 不,根据 OP 的要求,5 已经是工作日
    【解决方案2】:

    给 get_next_dayofweek_datetime 和 date_time 函数任何一天。

    from datetime import datetime as dt
    from datetime import timedelta
    
    def get_weekday(day):
        days  = ["mon","tue","wed","thu","fri","sat","sun"]
        return days.index(day) + 1
    
    def get_next_dayofweek_datetime(date_time, dayofweek):
        start_time_w = date_time.isoweekday()
        target_w = get_weekday(dayofweek)
        if start_time_w < target_w:
          day_diff = target_w - start_time_w
        else:
            day_diff = 7 - (start_time_w - target_w)
    
        return date_time + timedelta(days=day_diff)
    
    start_time = dt.strptime("2020-02-12 20:20:00", "%Y-%m-%d %H:%M:%S") # wednesday
    
    
    print(get_next_dayofweek_datetime(start_time, "thu"))
    print(get_next_dayofweek_datetime(start_time, "fri"))
    print(get_next_dayofweek_datetime(start_time, "sat"))
    print(get_next_dayofweek_datetime(start_time, "sun"))
    print(get_next_dayofweek_datetime(start_time, "mon"))
    print(get_next_dayofweek_datetime(start_time, "tue"))
    print(get_next_dayofweek_datetime(start_time, "wed"))
    print(get_next_dayofweek_datetime(start_time, "thu"))
    

    输出:

    2020-02-13 20:20:00
    2020-02-14 20:20:00
    2020-02-15 20:20:00
    2020-02-16 20:20:00
    2020-02-17 20:20:00
    2020-02-18 20:20:00
    2020-02-19 20:20:00
    2020-02-13 20:20:00
    

    【讨论】:

      【解决方案3】:

      答案:

      import datetime
      def to_week_day(date):
          if date.isoweekday() in set((6, 7)):
              date += datetime.timedelta(days=-date.isoweekday() + 8)
          return date
      

      说明:

      我今天遇到了这个问题,@jonrsharpe 的回答对我不起作用,因为date.isoweekday() % 5 = 1 是星期六 date.isoweekday() % 5 = 2 是星期天,导致下一个工作日分别是星期日和星期二,这是错误的。我不想在代码中使用 if 语句,所以我所做的是找到一个函数 y = f(x),它在 x = 6 时返回 y = 2,在 x = 7 时返回 y = 1。

      这个函数是y = -x + 8,它被用作timedelta函数的参数。

      这个答案是基于@jonrsharpe 的回答,所以你也应该支持他。

      【讨论】:

        【解决方案4】:
        def calculate_the_next_week_day(day_now):    
            if day_now.isoweekday()== 5:
                day_now += datetime.timedelta(days=3)
            elif day_now.isoweekday()== 6:
                day_now += datetime.timedelta(days=2)
            else:
                day_now += datetime.timedelta(days=1)
            return day_now
        

        【讨论】:

          猜你喜欢
          • 2010-12-07
          • 1970-01-01
          • 1970-01-01
          • 2013-06-26
          • 2013-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多