『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

datetimeモジュールで日付や時刻を操作する

datetimeモジュール

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

datetime.date

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

# PYTHON_DATETIME_DATE

# In[1]

# 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_DATETIME_TIME

# In[1]

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_DATETIME_DATETIME

# In[1]

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_DATETIME_TIMEDELTA

# In[1]

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日後の日付を求めています。

# In[2]

# 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_DATETIME_WEEKDAY

# In[1]

import datetime

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

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

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

# In[2]

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

# 日付差 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) のリストを用意しておけば、日時データに対応する曜日を表示させることができます。曜日番号はリストの各要素を参照するためのインデックス番号として用います。

# In[3]

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

# 曜日(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_DATETIME_FORMAT

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

コメント