動かざることバグの如し

近づきたいよ 君の理想に

Pythonで2つの日付からdate rangeを取得する

環境

やりたいこと

2つの日付からfor文で日付を回したい場合

rubyでいう

require 'date'
(Date.parse('2017-12-01')..Date.parse('2018-1-31')).each do |date|
  puts date.strftime("%F")
end

的なのをやりたい

コード

from datetime import date, timedelta
d1 = date(2017,12,1)
d2 = date(2018,1,31)

for i in range((d2 - d1).days + 1):
    date = d1 + timedelta(i)
    print(date.strftime("%F %R"))

以下のようにちゃんと日付が連続して出力される

2017-12-01 00:00
2017-12-02 00:00
2017-12-03 00:00
2017-12-04 00:00
2017-12-05 00:00
2017-12-06 00:00
2017-12-07 00:00
2017-12-08 00:00
2017-12-09 00:00
2017-12-10 00:00
2017-12-11 00:00
2017-12-12 00:00
2017-12-13 00:00
2017-12-14 00:00
2017-12-15 00:00
2017-12-16 00:00
2017-12-17 00:00
2017-12-18 00:00
2017-12-19 00:00
2017-12-20 00:00
2017-12-21 00:00
2017-12-22 00:00
2017-12-23 00:00
2017-12-24 00:00
2017-12-25 00:00
2017-12-26 00:00
2017-12-27 00:00
2017-12-28 00:00
2017-12-29 00:00
2017-12-30 00:00
2017-12-31 00:00
2018-01-01 00:00
2018-01-02 00:00
2018-01-03 00:00
2018-01-04 00:00
2018-01-05 00:00
2018-01-06 00:00
2018-01-07 00:00
2018-01-08 00:00
2018-01-09 00:00
2018-01-10 00:00
2018-01-11 00:00
2018-01-12 00:00
2018-01-13 00:00
2018-01-14 00:00
2018-01-15 00:00
2018-01-16 00:00
2018-01-17 00:00
2018-01-18 00:00
2018-01-19 00:00
2018-01-20 00:00
2018-01-21 00:00
2018-01-22 00:00
2018-01-23 00:00
2018-01-24 00:00
2018-01-25 00:00
2018-01-26 00:00
2018-01-27 00:00
2018-01-28 00:00
2018-01-29 00:00
2018-01-30 00:00
2018-01-31 00:00

変数汚したくない人向けにメソッド化したやつ

from datetime import date, timedelta

def daterange(date1, date2):
    for n in range(int ((date2 - date1).days)+1):
        yield date1 + timedelta(n)

start_date = date(2017,12,1)
end_date = date(2018,1,31)
for dt in daterange(start_date, end_date):
    print(dt.strftime("%Y-%m-%d"))

rubyだと一発でかけるがPythonまだまだだな。。

参考リンク