どくとる・めも

化学、数学、プログラミング、英語などに関する諸々

【Python】datetimeで時間管理【初心者向け】

PCのファイルを整理する上で、タイムスタンプは重要だ。私はかなりガサツな性分なので、「〇〇年の□月ごろにああいうファイルつくったよな〜」と検索をかけたりする。業務上の重要なファイルでさえもこんな感じなので、私にとってタイムスタンプは生命線なのだ。

Pythonでは、datetimeがその生命線を提供してくれそうだ。今回は、これらのライブラリでどういったことができるのかというのをまとめようと思う。

初心者向けと書いてあるのは、私自身が初心者なので、必然的にその程度の内容しか書けないということだ。当分はこんな感じが続くだろう。

現在の時間

まずは、現在の時間をprintさせてみる。

import datetime
print(datetime.datetime.now())

すると、西暦-月-日 時:分:秒という形式で、現在の時間が出力される。

2020-11-08 01:15:55.922275

真夜中にこれ書いてることがバレる...実際にはこのフルコースとまではいかずとも、時間だけとか、日付だけとかが欲しい場合もあるだろう。そういう時は、末尾に.yearとか.dayとかを付してやれば良い。

コードがけっこう長くなってしまうので、現在時刻に適当な名前をつける。

CurrentTime = datetime.datetime.now()
print(CurrentTime.year)
print(CurrentTime.month)
print(CurrentTime.day)
print(CurrentTime.hour)
print(CurrentTime.minute)
print(CurrentTime.second)

ピリオド以下を見れば何が出力されるかは明白だから、結果を載せる必要はないだろう。

時間差の表示

いつぞやにQiitaで”Hello World”を100万回表示させるという興味深い(?)エントリを拝見した。
qiita.com
forループを使った力技でこれをやってみて、処理に要した時間を測ってみよう。
...と思ったのだが、100万回だと2秒程度で処理が終わってしまい、少し味気ない結果になってしまった。なので、ここではその10倍の1000万回を試してみる(アホ)

ti = datetime.datetime.now()
for i in range (10000000):
    print("Hello World.")
tf = datetime.datetime.now()
print(tf-ti)

私の環境では、25秒くらいかかった。ちょっとしたベンチマークだなこれ。

0:00:25.468594

あと、CPU温度が一気に20℃ほど上がった。処理に使うプロセッサ数とかは指定できるんですかね?今後の課題。
いずれにせよ、このように時間差を取ることで、コードAとBで処理時間を比較することが可能になる。処理時間を真面目に検討しなければいけないようなガチアプリ開発とかはするつもりはないし出来ないけど、やはりデベロッパの皆様にとっては、処理速度というのはかなり重要だろう。

total_seconds()で秒に変換する

ところがコードAでは1時間10分、コードBでは40分30秒かかったという場合、BがAよりも処理が早いという定性的な判断は可能だが、「時間」とか「分」とかの単位が邪魔して、直接的に処理時間の比を求めることができない。そこで、所要時間を秒(seconds)に変換して両者の時間単位を統一することを考えよう。これを達成するために、total_seconds()メソッドを使うこととする。まずは、比較対象のための2つの時間を用意する。

t1 = datetime.timedelta(weeks=1, days=1, hours=1, minutes=1,
                        seconds=1, milliseconds=1, microseconds=1)

t2 = datetime.timedelta(weeks=2, days=2, hours=2, minutes=2,
                        seconds=2, milliseconds=2, microseconds=2)

t1は1週間と1日と1時間..., t2は2週間と2日と2時間...という風になっている。その上で、t1とt2の時間差を取り、これを秒に変換する。

td = t2-t1
print(td.total_seconds()) #694861.001001

だいたい70万秒という結果になった。が、時間が長すぎて、ほんとにこれで正しく計算できているのかよくわからない。もっと短い時間どうしで比較してみよう。

t3 = datetime.timedelta(minutes=1)
t4 = datetime.timedelta(minutes=5)
td = t4-t3
print(td.total_seconds()) #240.0

ちゃんと4分(=240秒)だけ差があることを計算してくれた。これで安心。

まとめ

  1. datetimeモジュールで現在の時刻を出力できる、ソースコードの冒頭と末尾で時刻を出力し、その差を取ることで、処理に要した時間がわかる。
  1. total_seconds()を用いることで、時間単位を秒に統一できる。

余談

前回のエントリで、ソースコードに色をつけて表示したいということを書いたが、今回からはCSSを使って書いてみた。といいつつ、CSSは名前した聞いたことがないレベル。現時点ではWebデザイン系にそこまで強い興味がない...
redo5151.hatenablog.com
また、本エントリの作成にあたっては以下を参考にした。こちらの方が20倍くらい詳しく書いてある。
note.nkmk.me

例のウイルスは、この頃の寒さに乗じて増殖しているようだ。感染して免疫を獲得した場合でも時間経過で抗体が減少するという話もあるし...2020年は辛気臭い年のまま終わってしまいそうだ。