日付をイテレート
日別に整理されたデータがある中で、一定期間のデータだけ分析を行いたいことはよくある。
期間を文字列で指定すると、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
コード
安心と信頼の、ノーエラーチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 |
月ごと版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 |