日付をイテレート
日別に整理されたデータがある中で、一定期間のデータだけ分析を行いたいことはよくある。
期間を文字列で指定すると、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