MAGAZINE

キャリテク!マガジン

コラム

Pythonモジュールdatetimeで日時計算プログラムを作ってみよう

こんにちは、吉政創成 菱沼です。

今回もPythonを使った自動化について、「シゴトがはかどるPython自動処理の教科書(著:クジラ飛行机様/マイナビ出版」を利用して学んでいきます。
Pythonに興味がある!という超初心者の方、ぜひお付き合いいただければ幸いです。

さて、前回はIDLEの使い方の説明と、IDLEに慣れるためにprintやstr、intといった関数を利用して遊んでみました。
今回はdatetimeという日時計算などを行うときに便利なモジュールを使ってみます。

■そもそもモジュールとは何か。

複数の関数、クラスによって作られた機能(部品)を一つのファイル(.py)にしたものをモジュールと言います。

今回使うdatetimeは日付に特化した機能が入っているファイル(モジュール)です。これを読み込むことで、日付に特化した機能を、誰でも簡単に使えるようになります。Pythonにはこういった便利な機能がひとつにまとまったモジュールと呼ばれる存在がたくさんあります。

もしdatetimeのような便利なモジュールが存在しなかった場合、自分で複数の関数を駆使していちから機能を作らなくてはならないため、とても大変です。機能を共有して下さる先人の方々に本当に感謝です…。

モジュール、パッケージ、ライブラリの違いは?

いくつかのモジュールを集めて一つにまとめたものをパッケージ、いくつかのパッケージをまとめてインストールできるようにしたものがライブラリと呼ばれています。

ライブラリにはPythonに最初から付属している標準ライブラリと、インストールして使う外部ライブラリがあります。機械学習でよく利用されているNumPyやpandasといった名前を聞くことがあると思いますが、あれらは外部ライブラリとなります。

標準ライブラリと外部ライブラリは以下のサイトでご確認ください。

標準ライブラリ一覧
PyPI(外部ライブラリ)

ちなみに、外部ライブラリの場合は事前にインストールしなくてはいけないので、PyPIで必要なライブラリを探し、コマンドプロント(windows)からpipコマンドで作業する必要があります。
ファイルを取得する際、もしWheelの形式が提供されていると環境構築がより楽にできるようです。 今回は細かな説明は省略しますが、以下に参考URLを書いておきますので、興味がありましたらご一読ください。

どうすればモジュールが使える?

以下のいずれかの書式で使うことができます。

①import モジュール名/ライブラリ名
②from モジュール名 import クラス名

①はモジュール全体、②はモジュールの中の指定したクラスのみがインポートされます。具体的な使い方は後ほど。

補足:オブジェクトとクラスとはなんぞ。

ところで、クラスやオブジェクト、メソッド、インスタンス…といった初心者にとっては馴染みのない単語がこれから所々に出てきます。他言語経験者ならともかく、プログラミング初心者にとってはオブジェクトやらクラスやら唐突に出てきても困りものですよね。私も「?」マークでいっぱいでしたし、いろんな方にお話を聞きつつ学習した今でも本当にこの解釈であっているのか納得がいかない部分があったりします。

ざっくり簡単にまとめると、クラスはひな形(設計図)で、実体化(インスタンス化)したものがインスタンスと呼ばれます。そしてクラスの動作を決めるものをメソッドと言います。メソッドはクラス内で書かれることもあれば、クラスの外に書かれることもあるそうです。

そしてオブジェクトはデータを抽象的にしたものだそうで、つまるところクラスもメソッドもインスタンスもオブジェクトの一種と言えるのだそうです。

オブジェクト指向やクラスについてはなかなか説明が難しい部分がありますが、詳しく解説してくれているサイトや動画がたくさんありますので、自分にとってわかりやすい説明を見つけてもらえればなと思いますし、周りにプログラミングをされている方がいれば聞いてもらえればなと思います。 ちなみにPythonにおいてはオブジェクト指向がなくとも初期の学習には問題はないらしいですが、より実践に近づくためには知っておいた方が良い知識だとのことでした。

■実践モジュールの使い方~importとfromの違いと名称の省略方法~

ではここからはdatetimeモジュールを例に、実際のモジュールの使い方を確認してみます。

datetimeモジュールの公式ドキュメントでの解説はこちらからご確認ください。 まずはテキストから引用です。テキストではfromを使ってますね。


引用P.23 (下図はテキスト内のコードの部分だけ転記し、実行した結果です。)

①の部分では日時に関するdatetimeモジュールにあるdatetimeオブジェクトを使うことを宣言します。そして、②の部分では、datetime.nowメソッドを呼び出して、現在日時を取得して表示します。なお、nowメソッドの戻り値は、datetime.datetime型のオブジェクトです。紛らわしいですが、これはdatetimeモジュールで定義されているdatetimeオブジェクト型という意味です。

(中略)

TIPS:datetimeモジュールのdatetimeオブジェクトって何? 日時を扱うdatetimeモジュールは、Python標準のモジュールです。そして、このモジュールの中で、datetimeというクラスが定義されています。実際に、Pythonのインストールフォルダにあるdatetime.pyというプログラムを開いてみると、datetimeというクラスが定義されており、このクラスに現在時刻を調べるnowメソッドが定義されています。


公式ドキュメントを見るとdatetimeで使用できるクラスは[date][time][datetime][timedelta][tzinfo][timezone]で、文中のサンプルはこの中の[datetime]というクラスを利用しているようです。

fromによるインポートなので、この例では[datetime]のクラスしか利用することができません。 同じモジュールの中で、いくつかのクラスを利用するつもりならimportの方を使った方が良いような気がしますね。

ところで、datetimeと何度も出てきて書くのが面倒くさいと思いませんか。思いますよね。 そんな時は[as]を使えば省略できます。

from文(左)で書く場合、asが適用されるのはクラス名に対してとなりますが、import文(右)で書く場合はモジュール名に対して適用されます。

名称は任意の名称を付けられますが、つけた後に元の名称で書くと「NameError」が発生しますので、必ずつけた名称で記述しましょう。 (※ちなみに、import文の時、省略しないで使う場合は[as dtt]は消し、2行目の[dtt]は[datetime]と省略せずに記述します。)

dir関数を使えばオブジェクトが持つ属性が調べられる

[datetime]クラスで使えるメソッドには[now]以外にどんなものがあるのでしょうか。そういったことを調べたいときには、オブジェクトが持つ属性(メソッドやプロパティなど)をリストで返してくれるPythonの標準の関数であるdir関数を使います。使い方はこんな感じ。

datetimeクラスの中に[now]が入っていることが確認できます。 同じように、[datetime]のモジュールそのものを指定することもできますし、関数を指定することもできます。

ちなみに「__(アンダースコア×2)」で前後を囲まれているものは特殊メソッドと呼ばれるものです。興味がある方は調べてみてくださいね。

■datetimeモジュールでできること

さて[datetime]クラスで使えるメソッド[now]は現在日時を調べるものでしたが、表示方法を変えることもできるようです。


引用P.23

なお、日時を画面に表示する際、日付だけを表示したかったり、秒は省略して時分だけ表示したかったりと、その状況に応じて異なるフォーマットで表示したい場合が多いものです。datetimeオブジェクトのstrftimeメソッドを使うと任意の書式で日時を表示できます。

・年月日時分秒の書式

書式意味
%Y西暦年(四桁)
%m月(二桁)
%d日(二桁)
%H時(二桁)
%M分(二桁)
%S秒(二桁)

(※テキストではコメントが途中に挿入されていますが画像内ではコメントは省略しています。)

なお、任意の日時を指定してdatetimeオブジェクトを作成する場合には、以下のように指定します。


日付のフォーマットは覚えておいた方がよさそうですね。
ここからはテキストの引用は極力省略し、datetimeモジュールでできる動作について確認していきます。

あと何日かを計算する

何日先かを調べたい日付を指定(①)した後、現在日時を指定(②)し、①-②の引き算によって日付を計算します。表示にはdaysというプロパティを使用③するそうです。

あと何秒かを計算する

あと何日かを計算したものと途中までは同じですが、残りの時間を調べるものになるため、secondsプロパティを参照する(①)ことであと何秒かを調べられるそうです。その後、1時間の秒数(60×60=3600秒)で割れば、秒単位から時間単位に変更することができます。

N日後を調べる

今日からN日後は何日かを調べる方法です。

ここで[timedelta]というクラスが新たに読み込まれました。複数のクラスを使いたい場合には「,」で並べるようです。

timedeltaは日数差や秒差、指定した日数が経過した日を求めることができるクラスとのこと。 これを使うとうるう年であっても簡単に計算できるようなので、平年とうるう年の両方をやってみましたが、確かに年以外の中身を変えずともそのまま計算できました。

ということで、今回はこちらで終了です。お付き合いいただきありがとうございました。

関連記事

過去の連載記事

  1. Linuxサーバの特徴とディストリビューション
  2. CentOSサーバの構築とユーザーの作り方
  3. CentOS 7でディレクトリを作ってみよう!
facebook シェアシェア
LINE シェアシェア