Python3で二つの日付からその間に含まれる日付リストを作成します。
開始日と日数から作成する場合にも使えます。
例えば
開始日 = 2018-02-24
終了日 = 2018-03-05
という情報から次のようなリストを得る処理です
2018-02-24
2018-02-25
2018-02-26
2018-02-27
2018-02-28
2018-03-01
2018-03-02
2018-03-03
2018-03-04
2018-03-05
3つの方法を紹介します
- シンプルにforとappendを使う場合
- lambdaを使う場合
- リスト内包表記を使う場合
共通部分
モジュールのインポート、日付条件の設定と日数の算出を行います。
# 使用するモジュールのインポート
from datetime import datetime as dt
from datetime import timedelta
# 日付条件の設定
strdt = dt.strptime("2018-02-24", '%Y-%m-%d') # 開始日
enddt = dt.strptime("2018-03-5", '%Y-%m-%d') # 終了日
# 日付差の日数を算出(リストに最終日も含めたいので、+1しています)
days_num = (enddt - strdt).days + 1 # (参考)括弧の部分はtimedelta型のオブジェクトになります
方法1、シンプルにforとappendを使う場合
# シンプルにforとappendを使用した場合
datelist = []
for i in range(days_num):
datelist.append(strdt + timedelta(days=i))
# 確認用
for d in datelist:
print(d.strftime("%Y-%m-%d (%A)"))
# 実行結果
# 2018-02-24 (Saturday)
# 2018-02-25 (Sunday)
# 2018-02-26 (Monday)
# 2018-02-27 (Tuesday)
# 2018-02-28 (Wednesday)
# 2018-03-01 (Thursday)
# 2018-03-02 (Friday)
# 2018-03-03 (Saturday)
# 2018-03-04 (Sunday)
# 2018-03-05 (Monday)
差の日数分、開始日に差の日数を加算しながらリストを作成しています。
方法2、lambdaを使う場合
# lambdaを使用う場合
datelist = map(lambda x, y=strdt: y + timedelta(days=x), range(days_num))
# 確認用(datelistはmapオブジェクトになります)
for d in datelist:
print(d.strftime("%Y-%m-%d (%A)"))
# 実行結果
# 2018-02-24 (Saturday)
# 2018-02-25 (Sunday)
# 2018-02-26 (Monday)
# 2018-02-27 (Tuesday)
# 2018-02-28 (Wednesday)
# 2018-03-01 (Thursday)
# 2018-03-02 (Friday)
# 2018-03-03 (Saturday)
# 2018-03-04 (Sunday)
# 2018-03-05 (Monday)
開始日+差の日数を計算して返す無名関数を作成し、mapを用いて差の日数リストを適用しています。
方法3、リスト内包表記を使う場合
# リスト内包表記を使用する場合
datelist = [strdt + timedelta(days=x) for x in range(days_num)]
# 確認用(datelistはmapオブジェクトになります)
for d in datelist:
print(d.strftime("%Y-%m-%d (%A)"))
# 実行結果
# 2018-02-24 (Saturday)
# 2018-02-25 (Sunday)
# 2018-02-26 (Monday)
# 2018-02-27 (Tuesday)
# 2018-02-28 (Wednesday)
# 2018-03-01 (Thursday)
# 2018-03-02 (Friday)
# 2018-03-03 (Saturday)
# 2018-03-04 (Sunday)
# 2018-03-05 (Monday)
lambdaを使用した場合と考え方は同じです。
おまけ(時間リストの作成)
lambda式内のdaysとなっている部分をhoursにすると、日付差の時間リストを得られます。
# 時間数を計算
hours_num = ((enddt - strdt).days + 1) * 24
# timedeltaのオプションをhoursに変更
hourlist = map(lambda x, y=strdt: y + timedelta(hours=x), range(hours_num))
for d in hourlist:
print(d.strftime("%Y-%m-%d %H"))
# 実行結果
# 2018-02-24 00
# 2018-02-24 01
# 2018-02-24 02
# ...
# 2018-03-05 21
# 2018-03-05 22
# 2018-03-05 23