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

And*_*ker 1 python date date-arithmetic

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

(要求的一些定义:将'周末'表示为周六和周日.日期范围包括在内,即结束日期是"全部或部分"范围的一部分意味着周末的任何部分都在日期范围内意味着计算整个周末.)

为了简化我想象你实际上只需要知道持续时间和一周的哪一天是初始的一天......

我现在很好,它将涉及做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
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 5

这种事情的一般方法:

对于一周中的每一天,计算在该日开始的"包含周末"之前需要多少天.例如,如果"包含周末"表示"包含星期六和星期日",那么我们有下表:

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

对于"部分或全部",我们有:

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

显然,这不必被编码为表格,现在看起来很明显.

然后,给定周期开始的星期几,从天数的长度中减去[*]魔术值(可能是开始结束+ 1,包括两个fenceposts).如果结果小于0,则它包含0个周末.如果它等于或大于0,则它包含(至少)1个周末.

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

更一般地说,这里"全部或部分"周末发生的事情是我们正在检查我们是否从有趣的位置("周末")中途开始.如果是这样,我们可以:

  • 1)计数一,将开始日期移动到有趣位的末尾,然后重新计算.
  • 2)将开始日期移回有趣位的开头,然后重新计算.

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

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