Учитывая диапазон дат, как мы можем разбить его на N смежных подинтервалов?

Я получаю доступ к некоторым данным через API, где мне нужно указать диапазон дат для моего запроса, напр. начало = '20100101', конец = '20150415'. Я думал, что я бы ускорил это, разбив диапазон дат на непересекающиеся интервалы и используя многопроцессорность на каждом интервале.

Моя проблема в том, что то, как я разбиваю диапазон дат, не всегда дает мне ожидаемый результат. Вот что я сделал:

from datetime import date

begin = '20100101'
end = '20101231'

Предположим, мы хотели бы разбить это на кварталы. Сначала я изменяю строку на даты:

def get_yyyy_mm_dd(yyyymmdd):
    # given string 'yyyymmdd' return (yyyy, mm, dd)
    year = yyyymmdd[0:4]
    month = yyyymmdd[4:6]
    day = yyyymmdd[6:]
    return int(year), int(month), int(day)

y1, m1, d1 = get_yyyy_mm_dd(begin)
d1 = date(y1, m1, d1)
y2, m2, d2 = get_yyyy_mm_dd(end)
d2 = date(y2, m2, d2)

Затем разделите этот диапазон на подинтервалы:

def remove_tack(dates_list):
    # given a list of dates in form YYYY-MM-DD return a list of strings in form 'YYYYMMDD'
    tackless = []
    for d in dates_list:
        s = str(d)
        tackless.append(s[0:4]+s[5:7]+s[8:])
    return tackless

def divide_date(date1, date2, intervals):
    dates = [date1]
    for i in range(0, intervals):
        dates.append(dates[i] + (date2 - date1)/intervals)
    return remove_tack(dates)

Используя начало и конец сверху, получаем:

listdates = divide_date(d1, d2, 4)
print listdates # ['20100101', '20100402', '20100702', '20101001', '20101231'] looks correct

Но если вместо этого я использую даты:

begin = '20150101'
end = '20150228'

...

listdates = divide_date(d1, d2, 4)
print listdates # ['20150101', '20150115', '20150129', '20150212', '20150226']

Мне не хватает двух дней в конце февраля. Мне не нужно время или часовой пояс для моего приложения, и я не против установить другую библиотеку.

Ответы на вопрос(1)

Ваш ответ на вопрос