如何创建迭代日期范围的 Python Generator 给我 3 天段?

Jef*_*man 1 python date generator python-2.7

我需要查询 API 以获取多月期间的数据。但是,API 的阻塞时间间隔超过 3 天。

所以我想创建一个生成器函数来将我的多月日期范围分成 3 天段,我可以在重复调用命中 API 的函数时使用这些段:当我传递开始日期和结束日期时,它给了我:

  • 第一次给我开始日期,开始日期+3天
  • 下次给我开始日期 + 3 天,开始日期 + 6 天
  • 此后每次向前移动 3 天
  • 直到它到达结束日期,如果我还有 1 或 2 天的数据要抓取,它会给我剩余的天数来达到结束日期
  • 停止

到目前为止,这是我的代码。它将第一次工作,但我不确定如何在下次调用该函数时使开始日期增加 3 天。而且我也不确定在达到最终结束日期之前我是否还有 1 或 2 天的时间来将我的until变量设置为最终结束日期——我认为现在它只是说“还有不到 3 天的时间,直到最后日期,所以让我们退出”:

3_day_segmenter(start, end):
    start_date = datetime.strptime(start, '%Y-%m-%d')
    end_date = datetime.strptime(end, '%Y-%m-%d')
    since = start_date
    for date in range(int ((end_date - start_date).days)): 
        until = start_date + datetime.timedelta(days=3)     
        yield since, until
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

根据您的需要调整生成一个间隔之间的日期时间列表

from datetime import date, timedelta

def perdelta(start, end, delta):
    curr = start
    while curr < end:
        yield curr, min(curr + delta, end)
        curr += delta
Run Code Online (Sandbox Code Playgroud)

这会产生一个(date1, date2)end最后一个段的日期约束的元组:

>>> for s, e in perdelta(date(2011, 10, 10), date(2011, 11, 10), timedelta(days=3)):
...     print s, e
... 
2011-10-10 2011-10-13
2011-10-13 2011-10-16
2011-10-16 2011-10-19
2011-10-19 2011-10-22
2011-10-22 2011-10-25
2011-10-25 2011-10-28
2011-10-28 2011-10-31
2011-10-31 2011-11-03
2011-11-03 2011-11-06
2011-11-06 2011-11-09
2011-11-09 2011-11-10
Run Code Online (Sandbox Code Playgroud)

请注意,最后的结果仅涵盖 2 天。