めも

メモ.

pythonで2つの日付・月・年の間のすべての日付・月・年を等間隔に取得したい

タイトル通りです。 指定した二つの日付の間の全ての日を取得したい。 また、指定した日付の間の全ての月や年も取得したい。

必要なモジュール

from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

dateutil.relativedeltaにて月・年の時間差分を計算することができる。 今回は年月日のみの計算だが、year, month, day, hour, minute, second, microsecondのオプションが用意されている. timedelta では日付の差分までしか取得できないので、年や月の足し引きを行いたい場合は dateutil.relativedelta を使用することになる.

コード

二つのタイムスタンプを受け取り、 day ならば二つの間の間の全ての日付を、 month ならば二つの間の間の全ての月を、 yearならば二つの間の間の全ての年を出力します.

dateutil.relativedeltaで終わりの日付を超えるまで足し続けるようにした方がよかったですね.

gist.github.com

出力例

get_alldate_between_startend(date(2010, 10, 8), date(2010, 10, 12), tsbase="day")

[datetime.date(2010, 10, 8),
 datetime.date(2010, 10, 9),
 datetime.date(2010, 10, 10),
 datetime.date(2010, 10, 11),
 datetime.date(2010, 10, 12)]

get_alldate_between_startend(date(2010, 12, 8), date(2013, 3, 9), tsbase="month")

# 出力
[datetime.date(2010, 12, 1),
 datetime.date(2011, 1, 1),
 datetime.date(2011, 2, 1),
 datetime.date(2011, 3, 1),
 datetime.date(2011, 4, 1),
 datetime.date(2011, 5, 1),
 datetime.date(2011, 6, 1),
 datetime.date(2011, 7, 1),
 datetime.date(2011, 8, 1),
 datetime.date(2011, 9, 1),
 # ... 省略 ...
 datetime.date(2013, 7, 1),
 datetime.date(2013, 8, 1),
 datetime.date(2013, 9, 1),
 datetime.date(2013, 10, 1),
 datetime.date(2013, 11, 1),
 datetime.date(2013, 12, 1),
 datetime.date(2013, 1, 1),
 datetime.date(2013, 2, 1),
 datetime.date(2013, 3, 1)]

get_alldate_between_startend(date(2010, 12, 8), date(2013, 3, 9), tsbase="year")

# 出力
[datetime.date(2010, 1, 1),
 datetime.date(2011, 1, 1),
 datetime.date(2012, 1, 1),
 datetime.date(2013, 1, 1)]

関連:日付特徴の作成

Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド

Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド