注意事項
- 自分用の簡単なまとめであり,説明はほとんどありません.
- 内容は時間があるときに補充します.
心の声
- datetime パッケージにデフォルトで用意されていれば良かったのに...
使用コード
import datetime
def list_date(start_date='2020-01-01', end_date='2020-01-31'):
# str型をdatetime型に変換する.
start_date = datetime.datetime.strptime(start_date, '%Y-%m-%d')
end_date = datetime.datetime.strptime(end_date, '%Y-%m-%d')
# 開始日と終了日の間隔を計算する.
days = (end_date - start_date).days
# 間隔の分だけfor文を回し,日を追加する.
tmp_date = start_date
date = [tmp_date]
for i in range(days):
tmp_date += datetime.timedelta(days=1)
date.append(tmp_date)
return date
使用例
date = list_date(start_date='2020-01-01', end_date='2020-01-05')
print(date)
実行結果
[datetime.datetime(2020 1, 1, 0, 0),
datetime.datetime(2020 1, 2, 0, 0),
datetime.datetime(2020 1, 3, 0, 0),
datetime.datetime(2020 1, 4, 0, 0),
datetime.datetime(2020 1, 5, 0, 0)]
コメントより
- ジェネレータ関数として実装する書き方を@shiracamus さんから教えていただきました.
- ジェネレータ関数なので,yield の部分で関数が一時停止し,呼び出し元に処理が戻ります.
- cf) range 関数
- ジェネレータ関数なので,yield の部分で関数が一時停止し,呼び出し元に処理が戻ります.
- 引数 step には,timedelta 関数の引数が入ります.
- weeks / days / hours / minutes / seconds / milliseconds / microseconds
- ex) days=1
- weeks / days / hours / minutes / seconds / milliseconds / microseconds
- for 文で range 関数のように使うこともできますし,リスト関数でリストに格納することもできます.
import datetime
def date_range(start_date='2020-01-01', end_date='2020-01-31', **step):
# str型をdatetime型に変換する.
start_date = datetime.datetime.strptime(start_date, '%Y-%m-%d')
end_date = datetime.datetime.strptime(end_date, '%Y-%m-%d')
# timedelta型の間隔を定義する.デフォルトは1日おき.
step = datetime.timedelta(**(step or dict(days=1)))
# while文を回し,yieldでジェネレータを返す.
date = start_date
while date < end_date:
yield date
date += step
使用例
date = list(date_range('2020-01-01', '2020-01-05', days=1, hours=12))
print(date)
実行結果
[datetime.datetime(2020, 1, 1, 0, 0),
datetime.datetime(2020, 1, 2, 12, 0),
datetime.datetime(2020, 1, 4, 0, 0)]