Skip to main content
 首页 » 编程设计

python之给定一个日期范围,如何计算部分或全部在该范围内的周末数

2025年05月04日12insus

给定一个日期范围,如何计算部分或全部在该范围内的周末数?

(根据要求的一些定义: 以“weekend”表示周六和周日。 日期范围包括在内,即结束日期是范围的一部分 'whichly or partially' 是指周末的任何部分落在日期范围内意味着整个周末都被计算在内。)

为简化起见,我想您实际上只需要知道持续时间和第一天是一周中的哪一天...

我该死的很好,现在它会涉及到除以 7 的整数除法和根据余数加 1 的一些逻辑,但我不太明白是什么...

Python 答案加分 ;-)

编辑

这是我的最终代码。

周末是周五和周六(因为我们计算的是住宿晚数),从周一开始天数为 0 索引。我使用了onebyone的算法和Tom的代码布局。非常感谢大家。

def calc_weekends(start_day, duration): 
    days_until_weekend = [5, 4, 3, 2, 1, 1, 6] 
    adjusted_duration = duration - days_until_weekend[start_day] 
    if adjusted_duration < 0: 
        weekends = 0 
    else: 
        weekends = (adjusted_duration/7)+1 
    if start_day == 5 and duration % 7 == 0: #Saturday to Saturday is an exception 
        weekends += 1 
    return weekends 
 
if __name__ == "__main__": 
    days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] 
    for start_day in range(0,7): 
        for duration in range(1,16): 
            print "%s to %s (%s days): %s weekends" % (days[start_day], days[(start_day+duration) % 7], duration, calc_weekends(start_day, duration)) 
        print 

请您参考如下方法:

这种事情的一般做法:

对于一周中的每一天,算出从那天开始的一段“包含周末”之前需要多少天。例如,如果“包含一个周末”表示“包含星期六和星期日”,那么我们有下表:

周日:8 星期一:7 周二:6 周三:5 星期四:4 周五:3 星期六:2

对于“部分或全部”,我们有:

周日:1 星期一:6 周二:5 星期三:4 星期四:3 周五:2 星期六:1

显然,这不必编码为表格,因为它的外观一目了然。

然后,给定周期开始的星期几,从以天为单位的周期长度中减去[*]魔法值(可能是开始-结束+1,以包括两个栅栏柱)。如果结果小于 0,则它包含 0 个周末。如果它等于或大于 0,则它包含(至少)1 个周末。

然后你必须处理剩下的日子。在第一种情况下,这很容易,每整整 7 天多一个周末。对于除星期日以外的每个开始日的第二种情况,情况也是如此,星期日只需要再多 6 天就可以包括另一个周末。因此,在第二种情况下,对于从周日开始的周期,您可以在周期开始时计算 1 个周末,然后从长度中减去 1,并从周一开始重新计算。

更一般地说,对于“整个或部分”周末,这里发生的事情是我们正在检查我们是否从有趣的部分(“周末”)中途开始。如果是这样,我们可以:

  • 1) 数一,将开始日期移到感兴趣的位的末尾,然后重新计算。
  • 2) 将开始日期移回感兴趣位的开始,并重新计算。

在周末的情况下,只有一个中途开始的特殊情况,所以 (1) 看起来不错。但是,如果您将日期作为以秒而不是天为单位的日期+时间获取,或者如果您对 5 天工作周而不是 2 天周末感兴趣,那么 (2) 可能更容易理解。

[*] 当然,除非您使用无符号类型。