Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのtimeモジュール徹底解説!時間を扱う主要関数と使い方を実例付きで紹介

Pythonでは、標準ライブラリの「time」モジュールを使うことで、時刻情報の取得・表現・操作をさまざまな方法で行えます。Pythonにおいて日付・時刻・日時はすべてオブジェクトとして扱われるため、これらに対して何らかの操作を行う際には、文字列やタイムスタンプそのものではなく、オブジェクトを操作していることになります。

本記事では、時刻に関するさまざまな処理を可能にする「time」モジュールについて詳しく解説します。

EPOCH(エポック)とは

timeモジュールは「EPOCH(エポック)」という規約に従っています。エポックとは、時刻のカウント起点となる時点のことです。Unixシステムでは、エポックは1970年1月1日の午前0時に設定されており、2038年までの時刻を表現できるようになっています。

自分のシステム上のエポック時刻を確認するには、以下のコードを実行します。

>>> import time
>>> time.gmtime(0)

実行結果

time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0,
tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Pythonにおける「ティック」とは?

ティック(tick)とは、秒を単位とした浮動小数点数で表される時間間隔のことです。また、夏時間(DST:Daylight Saving Time)が採用されている地域では、夏季に時計が1時間進み、秋季に元に戻るという扱いになります。

timeモジュールの主な関数

1. time.time() 関数

time()はtimeモジュールの中核となる関数です。エポックからの経過秒数を浮動小数点値として返します。

構文

time.time()

実際の動作を確認してみましょう。

import time
print("Number of seconds elapsed since the epoch are : ", time.time())

実行結果

Number of seconds elapsed since the epoch are : 1553262407.0398576

time.time()を使えば、2つの時点間の経過時間(ウォールクロック時間)を計測することもできます。

以下は経過時間を計測するプログラム例です。

import time
start = time.time()
print("Time elapsed on working...")
time.sleep(0.9)
end = time.time()
print("Time consumed in working: ",end - start)

実行結果

Time elapsed on working...
Time consumed in working: 0.9219651222229004

2. time.clock() 関数

time.clock()関数はプロセッサ時間(CPU時間)を返す関数で、パフォーマンステストやベンチマークの目的で使われてきました。

構文

time.clock()

clock()関数はプログラムが実際に消費した時間を返し、time()よりも高精度な計測が可能でした。

補足:time.clock()はPython 3.3で非推奨となり、Python 3.8で削除されました。現在は用途に応じて、高精度な計測にはtime.perf_counter()、CPU時間の計測にはtime.process_time()を使用することが推奨されています。

両者の違いを確認するためのプログラム例を見てみましょう。

import time
template = 'time()# {:0.2f}, clock()# {:0.2f}'
print(template.format(time.time(), time.clock()))
for i in range(5, 0, -1):
    print('---Sleeping for: ', i, 'sec.')
time.sleep(i)
print(template.format(time.time(), time.clock())
)

実行結果

time()# 1553263728.08, clock()# 0.00
---Sleeping for: 5 sec.
time()# 1553263733.14, clock()# 5.06
---Sleeping for: 4 sec.
time()# 1553263737.25, clock()# 9.17
---Sleeping for: 3 sec.
time()# 1553263740.30, clock()# 12.22
---Sleeping for: 2 sec.
time()# 1553263742.36, clock()# 14.28
---Sleeping for: 1 sec.
time()# 1553263743.42, clock()# 15.34

3. time.ctime() 関数

time.ctime()関数は、「エポックからの経過秒数」を入力として受け取り、ローカル時刻に基づいた人間が読める形式の文字列に変換します。引数を省略した場合は、現在の時刻を返します。

import time
print('The current local time is :', time.ctime())
newtime = time.time() + 60
print('60 secs from now :', time.ctime(newtime))

実行結果

The current local time is : Fri Mar 22 19:43:11 2019
60 secs from now : Fri Mar 22 19:44:11 2019

4. time.sleep() 関数

time.sleep()関数は、指定した秒数だけ現在のスレッドの実行を一時停止します。より正確な待機時間が必要な場合は、浮動小数点値を引数として渡しましょう。

sleep()は、ファイルのクローズ完了を待ちたい場合や、データベースへのコミットの完了を待機したい場合などに活用できます。

import time
# ctime()で現在時刻を表示
print ("Time starts from : ",end="")
print (time.ctime())
# sleep()で実行を一時停止
print ('Waiting for 5 sec.')
time.sleep(5)
# ctime()で現在時刻を再表示
print ("Time ends at : ",end="")
print (time.ctime())

実行結果

Time starts from : Fri Mar 22 20:00:00 2019
Waiting for 5 sec.
Time ends at : Fri Mar 22 20:00:05 2019

5. time.struct_time クラス

time.struct_timeは、timeモジュールに存在する唯一のデータ構造です。名前付きタプル(named tuple)インターフェースを持っており、インデックスまたは属性名のどちらでもアクセスできます。

構文

time.struct_time

このクラスは、日付の特定のフィールドにアクセスしたい場合に便利です。localtime()やgmtime()などの関数は、struct_timeオブジェクトを返します。

import time
print(' Current local time:', time.ctime())
t = time.localtime()
print('Day of month:', t.tm_mday)
print('Day of week :', t.tm_wday)
print('Day of year :', t.tm_yday)

実行結果

Current local time: Fri Mar 22 20:10:25 2019
Day of month: 22
Day of week : 4
Day of year : 81

6. time.strftime() 関数

strftime()関数は、第2引数にタプルまたはstruct_timeを受け取り、第1引数で指定したフォーマットに従って文字列へ変換します。

構文

time.strftime()

strftime()の実装例を紹介します。

import time
now = time.localtime(time.time())
print("Current date time is: ",time.asctime(now))
print(time.strftime("%y/%m/%d %H:%M", now))
print(time.strftime("%a %b %d", now))
print(time.strftime("%c", now))
print(time.strftime("%I %p", now))
print(time.strftime("%Y-%m-%d %H:%M:%S %Z", now))

実行結果

Current date time is: Fri Mar 22 20:13:43 2019
19/03/22 20:13
Fri Mar 22
Fri Mar 22 20:13:43 2019
08 PM
2019-03-22 20:13:43 India Standard Time

Pythonでタイムゾーンを確認する方法

タイムゾーンに関する情報を取得できるプロパティは2つあります。

1. time.timezone

ローカル(非DST)タイムゾーンのUTCからのオフセットを返します。

>>> time.timezone
-19800

2. time.tzname

ローカルの非DSTおよびDSTタイムゾーン名を含むタプルを返します。

>>> time.tzname
('India Standard Time', 'India Daylight Time')

まとめ

timeモジュールを使いこなせるようになれば、エポックからの経過秒数の取得、人間が読める形式への変換、処理の一時停止、日付フィールドへのアクセス、任意フォーマットへの変換など、時刻に関するあらゆる操作が可能になります。日常的なスクリプトからパフォーマンス計測まで幅広く活躍するモジュールなので、各関数の特徴と使い分けをしっかり押さえておきましょう。

  1. Pythonでのベクトル化とは?NumPyによる高速な配列演算の基礎を解説

    本記事では、Python 3.xにおける「ベクトル化(Vectorization)」の概念と、その実装に用いられるさまざまなテクニックについて解説します。ループ処理を排除した効率的なコードの書き方を、具体例とともに見ていきましょう。 ベクトル化とは何か? ベクトル化とは、ループを使用せずに配列操作を実装するテクニックです。関数を活用することで、コードの実行時間や計算時間を大幅に短縮できます。 ベクトル化では、配列に対して個別に処理を行うのではなく、ベクトル全体に対して一括で演算を実行します。代表的な演算には以下のようなものがあります。 ドット積(内積・スカラー積):2つのベクトルから単一のス

  2. Pythonのmathモジュール完全ガイド|定数・数値関数・べき乗・三角関数の使い方

    Pythonのmathモジュールとは Pythonのmathモジュールは、数学計算のための関数や定数をまとめた標準ライブラリです。このモジュールの関数は整数型や浮動小数点型(実数)のオブジェクトを対象としており、複素数には対応していません。複素数を扱いたい場合は、代わりにcmathモジュールを使用します。 mathモジュールを利用するには、まずコード内でインポートします。 import math mathモジュールの主な定数 mathモジュールには、計算式の中でそのまま使える便利な定数が用意されています。 番号定数と説明 1pi円周率πの値を返します(3.141592…)。 2E自然対数