【问题标题】:How do I count only weekdays from timedelta in pythonpython - 如何从python中的timedelta仅计算工作日
【发布时间】:2014-01-16 02:48:57
【问题描述】:

我得到了距离下一个“计费周期”(例如)从每月的nth 开始的天数:

from dateutil.relativedelta import relativedelta

dt = datetime.utcnow() + relativedelta(months=1,day=schedule.cycle_start)
days_till_next_cycle = dt - datetime.utcnow()

schedule.cycle_start 将在该月的第二天变成类似于 2 的位置。

这行得通……但是:

我如何找到timedelta 中的工作日数。

我查看了https://pypi.python.org/pypi/BusinessHours/ 并找不到任何文档。

我也看到了这个:Business days in Python 将我链接到上面的链接并滚动我自己的链接。那篇文章也已经 4 年了,我希望可能有更简单的方法?

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    通过 rrule,我能够使用上面的 dt 定义获得以下信息:

        from dateutil.rrule import *
        number_weekdays = rrule(WEEKLY, byweekday=(MO,TU,WE,TH,FR), dtstart=datetime.utcnow(),until=dt).count()
    

    【讨论】:

    • 不错的答案!顺便说一句,rrules 也有一个count method
    • 非常酷!如果说我只想按Mo,Tu,Th,Fr 计算,我可以把we 排除在元组之外吗?它会起作用吗? (例如,如果公司在星期三不营业?)
    • @RobParker 我相信我上面评论的答案是肯定的,因为我刚刚尝试过它并且它有效。只是仔细检查。
    【解决方案2】:

    这是一个计算两个日期之间的工作日数的简单函数:

    def business_days(since, until):
        since_isoweekday = since.isoweekday() + 1
        return len([x for x in range(since_isoweekday,
                                     since_isoweekday + (until - since).days)
                    if x % 7 not in [0, 6]])
    

    not in [0, 6] 代表周六和周日。

    一些测试:

    >>> since = datetime.datetime(2014, 6, 2)
    >>> until = datetime.datetime(2014, 6, 30)
    >>> business_days(since, until)
    20
    >>> since = datetime.datetime(2014, 6, 25)
    >>> until = datetime.datetime(2014, 7, 4)
    >>> business_days(since, until)
    7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 2016-11-24
      • 2022-08-11
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      相关资源
      最近更新 更多