日付と時刻

日付と時刻

datetimeモジュール

 標準ライブラリの datetimeモジュールをインポートすると、日付や時刻を表すオブジェクトを扱えるようになります。

datetime.dateクラス

 datetime.date は日付を扱うためのクラスです。西暦 (year), 月 (month), 日 (day) を引数に渡してインスタンスを作成します。3 つの引数は省略できません。

# PYTHON_DATE_01

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成
# 2018年10月15日
x = datetime.date(2018, 10, 15)

# xのもつデータを表示
print("日付 :", x)

# xのクラスを表示
print("クラス :", type(x))

# インスタンス変数を使って年月日を表示
print(x.year, "年", x.month, "月", x.day, "日")
日付 : 2018-10-15
クラス : <class 'datetime.date'>
2018 年 10 月 15 日

 西暦 (year), 月 (month), 日 (day) は読み出し専用のインスタンス変数(データ属性)としてオブジェクトに保存されます。たとえば

datetime.[dateオブジェクト].year

と記述すると、オブジェクトから西暦を取り出すことができます。
 

datetime.timeクラス

 datetime.time は時刻を扱うためのクラスです。時 (hour), 分 (minute), 秒 (second), ミリ秒 (millisecond) を引数に渡してインスタンスを作成します。時 (hour) 以外の引数は省略できます。

# PYTHON_DATE_02

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成
# 15時42分19秒
x = datetime.time(15, 42, 19)

# xのもつデータを表示
print("時刻 :", x)

# xのクラスを表示
print("クラス :", type(x))

# インスタンス変数を使って時刻を表示
print(x.hour, "時", x.minute, "分", x.second, "秒")
時刻 : 15:42:19
クラス : <class 'datetime.time'>
15 時 42 分 19 秒

 

datetime.datetimeクラス

 datetime.datetime は日時を扱うためのクラスです。西暦 (year), 月 (month), 日 (day), 時 (hour), 分 (minute), 秒 (second), ミリ秒 (millisecond) を引数に渡してインスタンスを作成できます。下のサンプルコードでは datetime.datetime.now()メソッド現在時刻を取得しています。

# PYTHON_DATE_03

# datetimeモジュールをインポート
import datetime

# datetimeオブジェクトのnowメソッドで現在の日付と時刻を取得
x = datetime.datetime.now()

# xのもつデータを表示
print("日付と時刻 :",x)

# インスタンス変数を使って年月日を表示
print(x.year, "年", x.month, "月", x.day, "日")

# インスタンス変数を使って時刻を表示
print(x.hour, "時", x.minute, "分", x.second, "秒")

# 日付と時刻のデータをタプルで取得
print(x.timetuple())
日付と時刻 : 2018-10-25 11:51:56.860432
2018 年 10 月 25 日
11 時 51 分 56 秒
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=25, tm_hour=15,
tm_min=38, tm_sec=5, tm_wday=3, tm_yday=298, tm_isdst=-1)

 datetime.datetime.timetuple() は、日付と時刻のデータをタプルで取得するメソッドです。実行結果の tm_wday は月曜日を 0 , 日曜日を 6 とした曜日番号を表しています。tm_yday はその年の 1 月 1 日から数えた経過日数です。
 

日時の演算と datetime.timedeltaクラス

 2018年11月21日から 2018年11月20日を差し引くと、1 day という値が返ります:

# PYTHON_DATE_04

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成

# 2018年11月21日
x = datetime.date(2018, 11, 21)

# 2018年11月20日
y = datetime.date(2018, 11, 20)

# 2018年11月21日と2018年11月20日の差を計算
print(x-y)

# x-yのクラスを表示
print(type(x-y))
1 day, 0:00:00
<class 'datetime.timedelta'>

 日時の差分 x-y のクラスを調べると、datetime.timedelta が表示されています。datetime.timedelta は日時の差を扱うクラスであり、日時の差をとると、datetime.timedeltaクラスのインスタンスが自動的に生成されます。datetime.timedeltaオブジェクトを使って日時の加算を実行することもできます。次のサンプルコードでは、datetime.timedeltaオブジェクトを使って、2018年5月10日から100日後の日付を求めています。

# PYTHON_DATE_05

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成
# 2018年5月10日
x = datetime.date(2018, 5, 10)

# datetime.timedeltaクラスのインスタンスを作成
dx = datetime.timedelta(100)

# 2018年5月10日から100日後の日付を表示
print(x + dx)
2018-08-18

曜日番号の取得

 datetime.dateオブジェクト、または datetime.datetimeオブジェクトの weekday()メソッドは月曜日を 0 , 日曜日を 6 とした曜日番号を返します。たとえば 2018年12月10日の曜日番号は、次のようなコードで取得することができます。

# PYTHON_DATE_06

# datetimeモジュールをインポート
import datetime

# 2018年12月10日
x = datetime.date(2018, 12, 10)

# 曜日番号を取得
print(x.weekday())
0

 次のサンプルコードを実行すると、12月10日から12月16日までの曜日番号を表示させることができます。

# PYTHON_DATE_07

# 12月10日~12月16日の曜日番号を表示

# datetimeモジュールをインポート
import datetime

# 日付差 dt = 1
dt = datetime.timedelta(1)

# 起点日時 (2018年12月9日)
x = datetime.date(2018, 12, 9)

# 日付と曜日番号を表示
for k in range(7):
    x += dt
    print(x, " 曜日番号", x.weekday())
2018-12-10  曜日番号 0
2018-12-11  曜日番号 1
2018-12-12  曜日番号 2
2018-12-13  曜日番号 3
2018-12-14  曜日番号 4
2018-12-15  曜日番号 5
2018-12-16  曜日番号 6

 weekday() によく似たメソッドに isoweekday() がありますが、こちらは月曜日を 1 , 日曜日を 7 とした曜日番号を返します。
 

曜日の表示

 曜日 (day of the week) のリストを用意しておけば、日時データに対応する曜日を表示させることができます。曜日番号はリストの各要素を参照するためのインデックス番号として用います。

# PYTHON_DATE_08

# 12月10日から12月16日までの曜日を表示

# datetimeモジュールをインポート
import datetime

# 曜日(day of the week)のリスト
dweek = ["月", "火", "水", "木", "金", "土", "日"]

# 日付差 dt = 1
dt = datetime.timedelta(1)

# 起点日時 (2018年12月9日)
x = datetime.date(2018, 12, 9)

# 日付と曜日を表示
for k in range(7):
    x += dt
    print(x, dweek[x.weekday()])
2018-12-10 月
2018-12-11 火
2018-12-12 水
2018-12-13 木
2018-12-14 金
2018-12-15 土
2018-12-16 日

 

日時を文字列に変換

 文字列の format()メソッドの引数に日時のデータを渡すと文字列型に変換して返します。日時の表示形式を指定することもできます。

# PYTHON_DATE_09

# datetimeモジュールをインポート
import datetime

# datetime.datetimeクラスのインスタンスを作成
# 2018年5月8日17時2分9秒
x = datetime.datetime(2018, 5, 8, 17, 2, 9)

# 西暦を4桁、月を下2桁、日を下2桁で表示
print("{:%Y/%m/%d}".format(x))

# 西暦を2桁、月を下2桁、日を下2桁で表示
print("{:%y/%m/%d}".format(x))

# 時を24時間表記、分を2桁、秒を2桁で表示
print("{:%H:%M:%S}".format(x))

# 時を12時間表記、分を2桁、秒を2桁で表示
print("{:%I:%M:%S}".format(x))

# AM,PMの表記、時を12時間表記、分を2桁、秒を2桁で表示
print("{:%p%I:%M:%S}".format(x))
2018/05/08
18/05/08
17:02:09
05:02:09
PM05:02:09