今回は、Pythonを使って日付を操作したり計算する方法などについてご紹介します。

プログラミングをしていると、日付を取得したり、足したり、引いたりする機会は結構多いと思います。

そんな時に活躍するのがdatetimeというモジュールです!datetimeは以下の様なオブジェクトを持っていて、これらがまた非常に便利なのです。

・datetime ⇒ 日時の計算

・date ⇒ 日付の計算

・time ⇒ 時間の計算

・timedelta ⇒日時の加算、減算

特に最後のtimedeltaを使いこなせる様になると、今日から50日後の日付を取得なんて操作はとっても簡単に実現できます。

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コード

■実行結果

■解説

まず、先頭でモジュール「datatime.datatime」を呼び出しています。

ライブラリdatatimeと同じ名前なので紛らわしいですね。。。このモジュールしか呼び出さない場合はモジュールまで読み込んで別名設定してあげる記述もよく見かけます。

実際の処理では以下の処理を行っています。

1)now()メソッドを使って現在時刻を表示

2)2018年5月1日15時30分50.5000秒を指定して表示

3)2018年5月1日を指定して表示

コードを見ていただいただけでも何となく処理の流れは掴んでいただけたと思います。

dateオブジェクト

datetime.dateとしてオブジェクトを呼び出します。

属性:year、 month、day(全て必須)

■Pythonコード

■実行結果

※datetimeオブジェクトの時と同じ様な内容なのでコード解説は省きます。

timeオブジェクト

datetime.timeとしてオブジェクトを呼び出します。

属性:hour、minute、second、microsecond

■Pythonコード

■実行結果

※こちらもdatetimeオブジェクトの時と同じ様な内容なので解説は省きます。

timedeltaオブジェクト

datetime.timedeltaとしてオブジェクトを呼び出します。

属性:weeks、day、hour、minute、second、microsecond、microseconds

実際に日付を加算する場合にはこのオブジェクトがものすごく役に立ちます。

冒頭でもシステムトレードのケースを例にしましたが、日付を加算する機会は結構多いからです。

dayを使って日付を加算する例を見てみましょう。

■Pythonコード

■実行結果

■解説

解説するまでもありませんが、timedelta(引数:days=5)は5日の事ですが。

2018年3月1日に5日が加算されて2018年3月6日となっています。

ループで日時を加算する例

もう少し実践的なコードを作成しましょう。ループ処理で日別に判定処理をしてみたいと思います。この処理を書くことができれば、冒頭でお話したシステムトレードのバックテストも実現可能です!

for文の場合とwhile文の場合で記載しています。

for文の場合

■Pythonコード

■実行結果

■解説

この場合はfor文を使った例です。dtの値は3月1日のままでループする毎に加算する日を1、2、3と増やしています。

while文の場合

■Pythonコード

■実行結果

■解説

while文の場合は、dtの値を1日ずつ加算する形に変えました。システムトレードで使用するのであれば、もしかしたら、こちらの方が理にかなっているかもしれません。

月またぎの加算/減算もOK

念のため月や年をまたぐ場合に、問題無く加算・減算されるか確認しましょう。

■Pythonコード

■実行結果

問題無く加算・減算されていますね!

 

「Python」をプログラミングスクールで学びたいならコチラ▼

まとめ

今回は日付の加算/減算を実現するためのdatetimeについてご紹介しました。今回学んだ事を実践していただければ、ループを回して日別に判定処理をするなんてロジックはお茶の子さいさいです!

基本的なモジュール(やオブジェクト)でありながら、様々なプログラムで活用される事になると思いますので、しっかりと理解を深めておいていただけたらと思います。