今回は、Pythonを使って日付を操作したり計算する方法などについてご紹介します。
プログラミングをしていると、日付を取得したり、足したり、引いたりするコードを書く機会は結構多いと思います。
そんな時に活躍するのがdatetimeというモジュールです!datetimeは以下の様なオブジェクトを持っていて、これらがまた非常に便利なのです。
- datetime ⇒ 日時の計算
- date ⇒ 日付の計算
- time ⇒ 時間の計算
- timedelta ⇒日時の加算、減算
特に最後のtimedeltaを使いこなせる様になると、今日から50日後の日付を取得なんて操作はとっても簡単に実現できます。
datetimeの使い方を覚えてPythonの日付計算の方法を身に付けてしまいましょう!
コンテンツ
Pythonを使った日付の計算はどんな時に使う?
このサイトではシステムトレードの作り方などについても解説しているので、システムトレードの手法を確立させる場合を例にして説明したいと思います。
システムトレードでは、トレード手法で使うシグナルの有効判定をする際、大量のバックテストをする必要があります。このバックテストというのは過去のマーケットデータを元にして、アルゴリズムの有効性を判定します。その際、データを順に判定する必要があるため、日付の計算が必須になります。
例えば、
1)2018年1月1日~2018年6月30日のデータを用意
2-1)2018年1月1日~2018年6月30日までループ処理する
2-2)ループしている対象日のデータに対してシグナルが有効かを判定する
2-3)シグナルが有効であれば(仮想的に)売買を行う
3)売買を行った結果の集計を行う
の様な処理を行う事があります。
この時、日付ループをする訳ですから、1日毎に加算をできるととっても楽です。しかも、システムトレードは時間単位でループさせる事もあるため、簡単に日別、時間別などでパラメータ変更ができれば非常に便利なのです。
少しマニアックな例だったかもしれませんが、実際にPythonで日付の計算をしてみましょう。
Pythonの日付計算に必要なモジュール「datetime」
Pythonで日付の計算をするために必要なモジュールは「datetime」です。
冒頭でもお話したオブジェクトを使いながら、日付の簡単な計算をしてみましょう!
datetimeオブジェクト
datetime.datetimeとしてオブジェクトを呼び出します。
属性:year、 month、day、hour、minute、second、microsecond
※year、month、day以外は省略が可能
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import datetime #現在日時 nowDT = datetime.datetime.now() print(nowDT) #日時を設定 ※引数を全て指定 editDT = datetime.datetime(2018, 5, 1, 15, 30, 50, 5000) print(editDT) #日時を設定 ※「年,月,日」のみ指定 editDT2 = datetime.datetime(2018, 5, 1) print(editDT2) |
■実行結果
1 2 3 |
2018-10-04 06:02:36.541130 2018-05-01 15:30:50.005000 2018-05-01 00:00:00 |
■解説
まず、先頭でモジュール「datatime.datatime」を呼び出しています。
ライブラリdatatimeと同じ名前なので紛らわしいですね。。。このモジュールしか呼び出さない場合はモジュールまで読み込んで別名設定してあげる記述もよく見かけます。
実際の処理では以下の処理を行っています。
1)now()メソッドを使って現在時刻を表示
2)2018年5月1日15時30分50.5000秒を指定して表示
3)2018年5月1日を指定して表示
コードを見ていただいただけでも何となく処理の流れは掴んでいただけたと思います。
dateオブジェクト
datetime.dateとしてオブジェクトを呼び出します。
属性:year、 month、day(全て必須)
■Pythonコード
1 2 3 4 5 6 7 8 9 |
import datetime #今日 nowDate = datetime.date.today() print(nowDate) #日を設定 editDate = datetime.date(2018, 5, 1) print(editDate) |
■実行結果
1 2 |
2018-10-04 2018-05-01 |
※datetimeオブジェクトの時と同じ様な内容なのでコード解説は省きます。
timeオブジェクト
datetime.timeとしてオブジェクトを呼び出します。
属性:hour、minute、second、microsecond
■Pythonコード
1 2 3 4 5 |
import datetime #日時を設定 editTime = datetime.time(15, 30, 50, 5000) print(editTime) |
■実行結果
1 |
15:30:50.005000 |
※こちらもdatetimeオブジェクトの時と同じ様な内容なので解説は省きます。
timedeltaオブジェクト
datetime.timedeltaとしてオブジェクトを呼び出します。
属性:weeks、day、hour、minute、second、microsecond、microseconds
実際に日付を加算する場合にはこのオブジェクトがものすごく役に立ちます。
冒頭でもシステムトレードのケースを例にしましたが、日付を加算する機会は結構多いからです。
dayを使って日付を加算する例を見てみましょう。
■Pythonコード
1 2 3 4 5 6 7 8 9 |
import datetime #2018年3月1日12時を設定 dt = datetime.datetime(2018, 3, 1, 12) print(dt) #5日を加算 dt = dt + datetime.timedelta(days=5) print(dt) |
■実行結果
1 2 |
2018-03-01 12:00:00 2018-03-06 12:00:00 |
■解説
解説するまでもありませんが、timedelta(引数:days=5)は5日の事ですが。
2018年3月1日に5日が加算されて2018年3月6日となっています。
ループで日時を加算する例
もう少し実践的なコードを作成しましょう。ループ処理で日別に判定処理をしてみたいと思います。この処理を書くことができれば、冒頭でお話したシステムトレードのバックテストも実現可能です!
for文の場合とwhile文の場合で記載しています。
for文の場合
■Pythonコード
1 2 3 4 5 6 7 8 9 |
import datetime #2018年3月1日12時を設定 dt = datetime.datetime(2018, 3, 1, 12) print(dt) for i in range(1,10): dt_work = dt + datetime.timedelta(days=i) print(dt_work) |
■実行結果
1 2 3 4 5 6 7 8 9 10 |
2018-03-01 12:00:00 2018-03-02 12:00:00 2018-03-03 12:00:00 2018-03-04 12:00:00 2018-03-05 12:00:00 2018-03-06 12:00:00 2018-03-07 12:00:00 2018-03-08 12:00:00 2018-03-09 12:00:00 2018-03-10 12:00:00 |
■解説
この場合はfor文を使った例です。dtの値は3月1日のままでループする毎に加算する日を1、2、3と増やしています。
while文の場合
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 |
import datetime #2018年3月1日12時を設定 dt = datetime.datetime(2018, 3, 1, 12) print(dt) i = 1 while i < 10: dt = dt + datetime.timedelta(days=1) print(dt) i = i + 1 |
■実行結果
1 2 3 4 5 6 7 8 9 10 |
2018-03-01 12:00:00 2018-03-02 12:00:00 2018-03-03 12:00:00 2018-03-04 12:00:00 2018-03-05 12:00:00 2018-03-06 12:00:00 2018-03-07 12:00:00 2018-03-08 12:00:00 2018-03-09 12:00:00 2018-03-10 12:00:00 |
■解説
while文の場合は、dtの値を1日ずつ加算する形に変えました。システムトレードで使用するのであれば、もしかしたら、こちらの方が理にかなっているかもしれません。
月またぎの加算/減算もOK
念のため月や年をまたぐ場合に、問題無く加算・減算されるか確認しましょう。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import datetime #2018年3月31日を設定 dt = datetime.datetime(2018, 3, 31) dt = dt + datetime.timedelta(days=1) print(dt) #2018年5月1日を設定 dt = datetime.datetime(2018, 5, 1) dt = dt - datetime.timedelta(days=1) print(dt) #2018年12月31日を設定 dt = datetime.datetime(2018, 12, 31) dt = dt + datetime.timedelta(days=1) print(dt) #2019年1月1日を設定 dt = datetime.datetime(2019, 1, 1) dt = dt - datetime.timedelta(days=1) print(dt) |
■実行結果
1 2 3 4 |
2018-04-01 00:00:00 2018-04-30 00:00:00 2019-01-01 00:00:00 2018-12-31 00:00:00 |
問題無く加算・減算されていますね!
まとめ
今回は日付の加算/減算を実現するためのdatetimeについてご紹介しました。今回学んだ事を実践していただければ、ループを回して日別に判定処理をするなんてロジックはお茶の子さいさいです!
基本的なモジュール(やオブジェクト)でありながら、様々なプログラムで活用される事になると思いますので、しっかりと理解を深めておいていただけたらと思います。
また、そもそもPythonのプログラムを作る流れを知りたい!という場合は以下の記事にPythonプログラムを作る流れを載せていますので、参考にしていただければと思います。
この記事ではPythonの使い方について解説をしていきます。 Pythonは記述方法が簡単で、人工知能のライブラリが非常に豊富な言語です。データサイエンティストの方からも人気があり、ここ数年では特に注目度の高い言語でもあ …
また、Pythonをしっかりと身に付けたいという場合はプログラミングスクールも検討されると良いかもしれません。
Pythonを習得したいという二ーズは年々高くなっています。 Pythonは人口知能(AI)や機械学習を活用できる強力なライブラリを活用する事ができるので、最先端の技術を扱いたいエンジニアにとっては非常に魅力的です。社会 …
Pythonを使いこなせる様になると、色々な事ができますので、ぜひ様々なプログラムを作ってみてほしいです。