2つのdatetime型の期間内で日毎、月毎に処理をする

2つのdatetime型の期間内の日毎、または月毎にdatetimeを返すジェネレータ
start_dateとend_dateの前後関係などは考慮していない

# coding=utf-8
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

def date_span(start_date, end_date):
    """start_date、end_dateの期間に含まれる日毎のdatetimeオブジェクトを返すジェネレータ
    """
    for n in range((end_date - start_date).days + 1):
        yield start_date + timedelta(n)


def month_span(start_date, end_date):
    """start_date、end_dateの期間に含まれる月毎のdatetimeオブジェクトを返すジェネレータ
    """
    yield start_date
    while(start_date.year != end_date.year or
          start_date.month != end_date.month):
        start_date = start_date + relativedelta(months=1)
        yield start_date


today = datetime.strptime('20120616', '%Y%m%d')
next_month = today + relativedelta(months=1)

for target_date in date_span(today, next_month):
    # 日毎の処理
    print target_date


for target_date in month_span(today, next_month):
    # 月毎の処理
    print target_date