Python工作日的日期范围生成器

jh3*_*314 11 python

我正在尝试创建一个生成器函数来迭代工作日(工作日),跳过周末(假期也会很好!).到目前为止,我只有一个函数可以简单地迭代几天:

def daterange(startDate, endDate):
    for i in xrange(int((endDate - startDate).days)):
        yield startDate + timedelta(i)
Run Code Online (Sandbox Code Playgroud)

我正在努力找出一种干净,高效,pythonic的方式让发电机在周末和假期跳过.提前致谢!

ear*_*arl 27

我强烈建议使用dateutil库来完成这些任务.在工作日中基本(忽略假期)迭代器只是:

from dateutil.rrule import DAILY, rrule, MO, TU, WE, TH, FR

def daterange(start_date, end_date):
  return rrule(DAILY, dtstart=start_date, until=end_date, byweekday=(MO,TU,WE,TH,FR))
Run Code Online (Sandbox Code Playgroud)


Bre*_*arn 10

假设startDate并且endDate是datetime或date对象,您可以使用weekday方法获取星期几,然后在星期六或星期日跳过它.做就是了:

def daterange(startDate, endDate):
    for i in xrange(int((endDate - startDate).days)):
        nextDate = startDate + timedelta(i)
        if nextDate.weekday() not in (5, 6):
            yield startDate + timedelta(i)
Run Code Online (Sandbox Code Playgroud)

对于假期,您必须手动检查您想要的每个假期.有些假期是以复杂的方式定义的,所以这可能有点棘手.


小智 8

Python pandas 有一个内置方法 bdate_range() ,它的默认频率是工作日。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.bdate_range.html

import pandas as pd
pd.bdate_range(start='1/25/2020', end='2/24/2020')
Run Code Online (Sandbox Code Playgroud)


Jon*_*nts 7

有一个有用的库dateutil,可以为你做这种事情.它可以生成日期范围(或基于自定义规则的日期),不包括某些天,考虑从一天开始的一周等...还有一个比内置日期时间库更灵活的timedelta.

文档位于http://labix.org/python-dateutil/ - 并在PyPi上提供