【问题标题】:Doing a multi-step date check for holidays/weekdays in Python在 Python 中对假期/工作日进行多步日期检查
【发布时间】:2018-12-04 11:59:00
【问题描述】:

场景:我正在尝试构建一个日期检查功能。该函数的输入是:年、月和假期列表(只是天的列表)。该函数将检查 input_date 是否在假期列表中,如果是,则将一天与 input_date 相加。接下来它将检查是哪个工作日:如果是星期六(总和 2),如果是星期日(总和 1)。

问题:我的问题是,如果我只是创建几个 if 子句来检查这些条件,周末检查后的新日期也可能在假期列表中,所以该过程应该重复,直到找到不在假期列表中的工作日。

问题:有没有办法将这些检查包含在一个循环中?

到目前为止的代码:

def datecheck (input_year, input_month, holiday_list):      
    datetime.inputdate =  date(year, month, 1) 

        # this checks if inputdate is a holiday   
        if inputdate is in holiday_list: 
            inputdate == inputdate + datetime.timedelta(days=1)

        # next part guarantees inputdate is a weekday
        if inputdate.weekday() == 5: 
            inputdate == inputdate + datetime.timedelta(days=2)
        else if inputdate.weekday() == 6:
            inputdate == inputdate + datetime.timedelta(days=1)

        #check again for holiday?

        outputdate = inputdate
    return outputdate

【问题讨论】:

    标签: python loops date datetime calendar


    【解决方案1】:

    while 循环可以解决问题:

        # this checks if inputdate is a holiday   
        while inputdate in holiday_list: 
            inputdate == inputdate + datetime.timedelta(days=1)
    

    它将继续运行代码,直到表达式(如果 inputdate 在 holiday_list 中)计算结果为 false。

    将其余逻辑添加到循环中的示例:

    def datecheck (input_year, input_month, holiday_list):      
        inputdate =  date(input_year, input_month, 1) 
    
        valid = False
    
        while not valid:
            # this checks if inputdate is a holiday   
            if inputdate is in holiday_list: 
                inputdate == inputdate + datetime.timedelta(days=1)
    
            # next part guarantees inputdate is a weekday
            elif inputdate.weekday() == 5: 
                inputdate == inputdate + datetime.timedelta(days=2)
    
            elif inputdate.weekday() == 6:
                inputdate == inputdate + datetime.timedelta(days=1)
    
            else:
                valid = True
    
        return inputdate
    

    我还清理了其他一些东西:

    • else if 应该是 elif,而 is in 应该只是 in
    • 一旦循环到位,就不需要outputdate,因为一旦循环完成,inputdate 将具有正确的值
    • datetime.inputdate 应该只是 inputdate 我假设? datetime 是标准库中模块的名称,但它没有 inputdate 属性
    • 第一个 if 语句及以后的语句缩进太远
    • 我还将正确的参数名称放入date(),但请注意,您需要在此代码上方使用from datetime import date 之类的名称,以便识别date

    【讨论】:

    • 感谢您的回答。在这种情况下,我还可以在这个循环中添加工作日检查吗?因为平日检查后,如果是假期,我需要再次检查。
    • 您可以在其中放置尽可能多的逻辑,以在每次日期无效时运行。我会用一个例子来编辑答案。
    • 感谢您添加示例。我只是有点困惑:我明白第一次检查日期是否在假期清单上。我的问题是:如果日期不在假期列表中,我仍然应该检查它是否是工作日(如果不是添加天数),然后再次检查假期列表。但我不明白如果 weekday() 检查在函数内部,代码如何解释这一点。
    • 这个循环的本质是:holiday_list中的日期是?如果不是,是工作日 5 吗?如果不是,是工作日 6 吗?如果这些都不是,valid 设置为 True。当循环再次开始时,它将检查not valid 是否为真,它会停在那里并且不会再次运行循环代码。如果在循环期间满足任何这些条件,它将添加天数,然后移动到 if - elif - else 块的底部,因为它已经匹配其中一个。然后循环重新开始并重复 if - elif - else 检查。
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多