LoginSignup
29
18

More than 5 years have passed since last update.

Python3で開始日と終了日からその間の日付リスト(あるいは時間リスト)を得る

Last updated at Posted at 2018-04-05

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
29
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
18