概要
datetimeモジュールを使用して日付や時刻を扱う方法について紹介します。
この記事ではdatetimeクラスを使用した日時取得等を説明します。
datetimeモジュール
基本的な型
名前 | 説明 |
---|---|
date | 年月日の日付を扱う |
time | 時分秒、マイクロ秒の時刻を扱う。特定の日付に依らない |
datetime | 年月日時分秒、マイクロ秒の日付時刻を扱う |
timedelta | 経過時間を表す。datetimeの差を扱う |
使用方法
datetimeを使用して現在時刻を取得する
モジュールを読み込む。(モジュールとはファイル名のこと)
その次にdatetimeクラスのnowメソッドを使用する。
# モジュールを読み込む
import datetime
# 現在日時を取得
now = datetime.datetime.now()
print(now) # 2023-06-04 13:52:31.515904
モジュールの読み込み方
datetimeモジュールをimportした場合のnowメソッドの使用方法
# モジュールを読み込む
import datetime
# 現在日時を取得
now = datetime.datetime.now()
print(now) # 2023-06-04 13:52:31.515904
①datetimeモジュール名(ファイル名)
②datetimeモジュール名
③datetimeクラス
④メソッド名
datetimeモジュールのdatetimeクラスをimportした場合のnowメソッドの使用方法
# モジュールを読み込む
from datetime import datetime
# 現在日時を取得
now = datetime.now()
print(now) # 2023-06-04 13:52:31.515904
①datetimeモジュール名(ファイル名)
②datetimeクラス名
③datetimeクラス名
④メソッド名
datetimeを使用して指定した日時を作成する
from datetime import datetime
# 2023年6月1日0時0分0秒のdatetimeを作成
dt = datetime(2022, 6, 1, 0, 0, 0)
print(dt) # 2022-06-01 00:00:00
指定した日付情報を取得したいとき
時分秒を指定せず、年月日だけdatetimeコンストラクタの引数に指定すればOK。
from datetime import datetime
# 2023年6月1日のdatetimeを作成
dt = datetime(2022, 6, 1)
print(dt) # 2022-06-01 00:00:00
年、月、日の抽出
datetimeから日付情報を取得し、year,month,day属性を用いて抽出する。
from datetime import datetime
# 現在日付を取得(2023/6/4の場合)
now = datetime.now()
print(now.year) # 2023
print(now.month) # 6
print(now.day) # 4
年、月、日以外の値も抽出したいとき
以下の属性を指定すれば抽出可能。
属性 | 抽出内容 |
---|---|
year | 年 |
month | 月 |
day | 日 |
hour | 時 |
minute | 分 |
second | 秒 |
microsecond | マイクロ秒(100万分の1秒) |
from datetime import datetime
# 現在日付を取得(2023/06/04 14:10:46.930268の場合)
now = datetime.now()
# 年
print(now.year) # 2023
# 月
print(now.month) # 6
# 日
print(now.day) # 4
# 時間
print(now.hour) # 14
# 分
print(now.minute) # 10
# 秒
print(now.second) # 46
# マイクロ秒
print(now.microsecond) # 930268
曜日を取得したい場合
weekday()
datetime型から曜日を取得したい場合、weekday()を使用する。
使用方法は以下のとおり。
from datetime import datetime
# 指定した日付を作成して曜日表示
dt = datetime(2022, 6, 1, 0, 0, 0)
print(dt.weekday()) # 2
weekdayを使用すると数値が返却される。
数値が意味する曜日は以下となる。
月 | 火 | 水 | 木 | 金 | 土 | 日 |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 |
●●曜日と取得したい場合、以下のように曜日情報を定数などに定義しておればOK。
from datetime import datetime
WEEK = { 0: "月曜日", 1: "火曜日", 2: "水曜日", 3: "木曜日", 4: "金曜日", 5: "土曜日", 6: "日曜日" }
# 指定した日付を作成して曜日を表示
dt = datetime(2022, 6, 1, 0, 0, 0)
print(WEEK[dt.weekday()]) # 水曜日
文字列からdatetimeに変換
strptime()
文字列からdatetimeオブジェクトに変換したい場合、datetimeクラスのstrptime()を使用する。
使用方法は以下のとおり。
from datetime import datetime
# 文字列からdatetimeを作成ケース1
str_date_01 = "2023年6月1日10時15分10秒"
format_01 = "%Y年%m月%d日%H時%M分%S秒"
print(datetime.strptime(str_date_01, format_01)) # 2023-06-01 10:15:10
# 文字列からdatetimeを作成ケース2
str_date_02 = "2023/6/1"
format_02 = "%Y/%m/%d"
print(datetime.strptime(str_date_02, format_02)) # 2023-06-01 00:00:00
# 文字列からdatetimeを作成ケース3
str_date_03 = "2023-6-1"
format_03 = "%Y-%m-%d"
print(datetime.strptime(str_date_03, format_03)) # 2023-06-01 00:00:00
尚、存在しない日付等を変換しようとするとValueErrorが発生する。
日付変換フォーマット記号例
フォーマット記号は以下のような種類がある。
記号 | 意味 |
---|---|
%Y | 西暦(4桁) |
%m | 月 |
%d | 日 |
%H | 時 |
%M | 分 |
%S | 秒 |
%f | マイクロ秒 |
元号からdatetimeに変換したいとき
元号「令和」の場合
from datetime import datetime
# 元号"令和"の開始年を定義
REIWA_START_YEAR = 2019
# 元号と年月日を含む文字列
str_date = "令和5年6月1日"
# "令和"以降の文字列を抽出し、年月日を取得
str_date_list = str_date[2:].replace("年", " ").replace("月", " ").replace("日", "").split()
year, month, day = map(int, str_date_list)
# "令和"の開始年と年を加算し、月と日を追加
dt = datetime(REIWA_START_YEAR + year - 1, month, day)
print(dt) # 2023-06-01 00:00:00
元号「平成」の場合
from datetime import datetime
# 元号"平成"の開始年を定義
HEISEI_START_YEAR = 1989
# 元号と年月日を含む文字列
str_date = "平成1年10月10日"
# "平成"以降の文字列を抽出し、年月日を取得
str_date_list = str_date[2:].replace("年", " ").replace("月", " ").replace("日", "").split()
year, month, day = map(int, str_date_list)
# "平成"の開始年と年を加算し、月と日を追加
dt = datetime(HEISEI_START_YEAR + year - 1, month, day)
print(dt) # 1989-10-10 00:00:00
datetimeから文字列に変換
f-stringの使用
datetimeから文字列に変換する場合、f-stringを使用する。
from datetime import datetime
# 2023年6月1日のdatetimeを作成
some_day = datetime(2023, 6, 1)
# datetimeから文字列を作成
print(f"{some_day:%Y/%m/%d}") # 出力:2023/06/01
# 2023年6月1日 10時20分30秒のdatetimeを作成
some_day_2 = datetime(2023, 6, 4, 10, 20, 30)
# datetimeから文字列を作成
print(f"{some_day_2:%Y年%m月%d日%H時%M分%S秒}") # 出力:2023年06月04日10時20分30秒
#曜日の表示
print(f"{some_day_2:%A}") # Sunday
print(f"{some_day_2:%a}") # Sun
datatimeから元号に変換したいとき
from datetime import datetime
# 元号変換対象の日時
date = datetime(2019, 5, 1)
if datetime(1868, 1, 25) <= date < datetime(1912, 7, 30):
era_name = "明治"
year = date.year - 1867
elif datetime(1912, 7, 30) <= date < datetime(1926, 12, 25):
era_name = "大正"
year = date.year - 1911
elif datetime(1926, 12, 25) <= date < datetime(1989, 1, 8):
era_name = "昭和"
year = date.year - 1925
elif datetime(1989, 1, 8) <= date < datetime(2019, 5, 1):
era_name = "平成"
year = date.year - 1988
else: # 2019-05-01以降
era_name = "令和"
year = date.year - 2018
if year == 1:
year = "元"
f"{era_name}{year}年{date.month}月{date.day}日"
# '令和元年5月1日'
文字列変換フォーマット記号例
文字列変換フォーマット記号は以下のような種類がある。
記号 | 意味 |
---|---|
%Y | 西暦(4桁) |
%m | 月(0埋めして2桁表記) |
%d | 日(0埋めして2桁表記) |
%H | 時(0埋めして2桁表記。24時間) |
%M | 分(0埋めして2桁表記) |
%S | 秒(0埋めして2桁表記) |
%f | マイクロ秒(左側から0埋め) |
%w | 曜日の番号(0-6の整数。0が日曜) |
%A | 曜日の名前(Sundayなど) |
%a | 曜日の短縮形(Sunなど) |
datetime変数.weekday()の場合、月曜日が0だが文字列変換の「%w」を使用すると日曜日が0なので注意すること。
補足:Python3.5以前のバージョンの場合の文字列変換
f-stringはPython3.6以降に登場した機能となる。
そのため、Python3.5以前のバージョンで実装している場合、文字列変換は以下を使用すること。
strftime()
from datetime import datetime
# 文字列からdatetimeを作成
FORMAT = "%Y年%m月%d日"
# 日付を作成
some_day = datetime(2023, 6, 1)
# 文字列に変換
str_day = some_day.strftime(FORMAT)
print(str_day) # 2023年06月01日