首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种简单的数学运算蟒蛇

一种简单的数学运算蟒蛇
EN

Stack Overflow用户
提问于 2016-11-06 18:07:48
回答 1查看 49关注 0票数 0

我有一个方法,它返回指定范围内的天数,不包括某些特定的日子,如星期五。举个例子,如果你拿出周五和周四,从2016-8-6到2016-9-6,结果将是8天假期和24个工作日。如果我想做反向操作,如果我只有工作日和开始日期,我如何找到结束日期(2016-9-6)。

代码语言:javascript
复制
from datetime import datetime, timedelta

def measure_workingdays(start_date, end_date, off_days):
    format = "%Y-%m-%d"
    if not isinstance(start_date, datetime):
        start_date = datetime.strptime(start_date, format)
    if not isinstance(end_date, datetime):
        end_date = datetime.strptime(end_date, format)
    total_days = (end_date - start_date).days + 1 # + 1 Because it count one day less
    holiday = 0
    start = start_date
    for rec in range(total_days):
        day = start.strftime("%a")
        if day in off_days:
            holiday += 1
        start += timedelta(days=1)
    print(holiday) # 8
    working_days = total_days - holiday
    print(working_days) # 24


start_date = "2016-8-6"
start_date = datetime.strptime(start_date, "%Y-%m-%d")
end_date = "2016-9-6"
end_date = datetime.strptime(end_date, "%Y-%m-%d")
off_day = ['Fri','Thu']

working_days = measure_weekdays(start_date, end_date, off_day)

反向操作实例

代码语言:javascript
复制
def measure_weekdays_reverse(start_date, paid, off_days):
    format = "%Y-%m-%d"
    if not isinstance(start_date, datetime):
        start_date = datetime.strptime(start_date, format)
    holiday = 0
    start = start_date
    for rec in range(paid):
        day = start.strftime("%a")
        if day in off_days:
            holiday += 1
        start += timedelta(days=1)
    print(holiday) # Output 6 instead of 8
    last_paid_date = start + timedelta(days=holiday)
    print(last_paid_date) # output 2016-09-05 insteaad of 2016-09-06

total_days = measure_weekdays_reverse(start_date, 24, ["Fri","Thu"])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-06 18:28:24

错误是,您只循环一个固定的次数(有薪天数),因此,如果您遇到假期,实际上您将无法迭代找到所有真正的带薪天数,这可能仍然隐藏了一些假期。

您可以通过在假日添加一个内部循环来解决这个问题。改变这一点:

代码语言:javascript
复制
for rec in range(paid):
    day = start.strftime("%a")
    if day in off_days:
        holiday += 1
    start += timedelta(days=1)
print(holiday) # Output 6 instead of 8
last_paid_date = start + timedelta(days=holiday)

对此:

代码语言:javascript
复制
for rec in range(paid):
    day = start.strftime("%a")
    while day in off_days:
        holiday += 1
        start += timedelta(days=1)
        day = start.strftime("%a")
    last_paid_date = start
    start += timedelta(days=1)
print(holiday)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40452729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档