日付をイテレート
日別に整理されたデータがある中で、一定期間のデータだけ分析を行いたいことはよくある。
期間を文字列で指定すると、1日ずつ順番に日付を返すジェネレータがあると便利。
使い方
- 入力文字列の指定方法
<Date> ::= “YYYYMMDD”形式の日付文字列<Dates>::= <Date> | <Date>-<Date> | <Dates>,<Dates><Dates>を指定する
- ハイフン区切り「
YYYYMMDD-YYYYMMDD」は、期間を表す - カンマ区切り「
YYYYMMDD,YYYYMMDD」は、別々の2日を表す
(例)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

