目次

日付をイテレート

日別に整理されたデータがある中で、一定期間のデータだけ分析を行いたいことはよくある。

期間を文字列で指定すると、1日ずつ順番に日付を返すジェネレータがあると便利。

使い方

(例)20150101-20150331,20150701,20150801
⇒ 2015/01/01~2015/03/31の各日、2015/07/01、2015/08/01

コード

安心と信頼の、ノーエラーチェック

from datetime import datetime
from dateutil.relativedelta import relativedelta

# 補助関数
def _generate_between_date(start_date_str, stop_date_str):
    start_date = datetime.strptime(start_date_str, '%Y%m%d')
    stop_date = datetime.strptime(stop_date_str, '%Y%m%d')
    while start_date <= stop_date:
        yield start_date.strftime('%Y%m%d')
        start_date += relativedelta(days=1)

# こちらを使う
def date_sequence_generator(dates_str):
    for date_str in dates_str.split(','):
        if '-' in date_str:
            for date in _generate_between_date(*date_str.split('-')):
                yield date
        else:
            yield date_str

月ごと版

from datetime import datetime
from dateutil.relativedelta import relativedelta

def _generate_between_month(start_month_str, stop_month_str):
    start_month = datetime.strptime(start_month_str, '%Y%m')
    stop_month = datetime.strptime(stop_month_str, '%Y%m')
    while start_month <= stop_month:
        yield start_month.strftime('%Y%m')
        start_month += relativedelta(months=1)

def month_sequence_generator(months_str):
    for month_str in months_str.split(','):
        if '-' in month_str:
            for month in _generate_between_month(*month_str.split('-')):
                yield month
        else:
            yield month_str