[解決!Python]日付や時刻の文字列表現をstrptimeメソッドでdatetime型のオブジェクトに変換するには解決!Python

datetimeクラスのstrptimeクラスメソッドを使って、文字列として表現されている日付や時刻からdatetime型のオブジェクトを作成する方法を紹介する。

» 2024年03月01日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

* 本稿は2021年11月24日に公開された記事をPython 3.12.2で動作確認したものです(確認日:2024年3月1日)。


from datetime import datetime, timedelta, timezone

str_date = '2021/11/24 12:34:56'
mydate = datetime.strptime(str_date, '%Y/%m/%d %H:%M:%S')
print(mydate)  # 2021-11-24 12:34:56

str_date = '2021年11月24日 12時34分56秒'
mydate = datetime.strptime(str_date, '%Y年%m月%d日 %H時%M分%S秒')
print(mydate)  # 2021-11-24 12:34:56

# 西暦2桁
str_date = '21/11/24 12:34:56'
mydate = datetime.strptime(str_date, '%y/%m/%d %H:%M:%S')
print(mydate)  # 2021-11-24 12:34:56

# 12時間制
str_date = '2021/11/24 01:23:45(PM)'
mydate = datetime.strptime(str_date, '%Y/%m/%d %I:%M:%S(%p)')
print(mydate)  # 021-11-24 13:23:45

# 曜日付き
str_date = '2021/11/24(Wed) 12:34:56'
mydate = datetime.strptime(str_date, '%Y/%m/%d(%a) %H:%M:%S')
idx = mydate.weekday()
day_of_week = '月火水木金土日'
print(f'{mydate} ({day_of_week[idx]})'# 2021-11-24 12:34:56 (水)

# タイムゾーン付き
str_date = '2021/11/24 12:34:56+0900(JST)'
mydate = datetime.strptime(str_date, '%Y/%m/%d %H:%M:%S%z(%Z)')
print(f'{mydate} ({mydate.tzname()})'# 2021-11-24 12:34:56+09:00 (JST)

# Windowsでは上のコードでは例外が発生するので自前で処理
str_date = str_date.split('+')[0]
mydate = datetime.strptime(str_date, '%Y/%m/%d %H:%M:%S')
print(f'{mydate} ({mydate.tzname()})'# 2021-11-24 12:34:56 (None)

jst_tdelta = timedelta(hours=+9)
JST = timezone(jst_tdelta, 'JST')
mydate = mydate.astimezone(JST)
print(f'{mydate} ({mydate.tzname()})'# 2021-11-24 12:34:56+09:00 (JST)


datetime.strptimeクラスメソッドによる日付/時刻の文字列表現のパース

 Pythonに標準で添付されるdatetimeモジュールが提供するdatetimeクラスにはstrptimeメソッドがある。このメソッドを使うと文字列として表現された日付や時刻からdatetime型のオブジェクトを作成できる。なお、ISO 8601で規定されている「YYYY-MM-DDThh:mm:ss」形式で表現された文字列からdatetimeオブジェクトを作成する方法については「datetime型の日付や時刻と、ISO 8601形式の文字列とを相互変換するには」を参照されたい。

 以下に単純な例を示す。

from datetime import datetime, timedelta, timezone

str_date = '2021/11/24 12:34:56'
mydate = datetime.strptime(str_date, '%Y/%m/%d %H:%M:%S')
print(mydate)  # 2021-11-24 12:34:56

str_date = '2021年11月24日 12時34分56秒'
mydate = datetime.strptime(str_date, '%Y年%m月%d日 %H時%M分%S秒')
print(mydate)  # 2021-11-24 12:34:56


 strptimeクラスメソッドには、datetime型のオブジェクトに変換したい文字列表現と、それをパースする際の書式指定文字列を渡す。上の例では「2021/11/24 12:34:56」または「2021年11月24日 12時34分56秒」という日付と時刻の文字列表現をそれぞれ「%Y/%m/%d %H:%M:%S」および「%Y年%m月%d日 %H時%M分%S秒」という書式指定文字列を使ってパースして、datetimeオブジェクトを取得している。

 書式指定文字列には以下のような書式コードを記述できる(一部)。

書式コード 説明
%Y 西暦(4桁表記。0埋め) 2021
%m 月(2桁表記。0埋め) 11
%d 日(2桁表記。0埋め) 04
%H 時(24時間制。2桁表記。0埋め) 17
%M 分(2桁表記。0埋め) 37
%S 秒(2桁表記。0埋め) 28
%y 西暦の下2桁(0埋め) 21
%l AM/PMを表す文字列 PM
%x 日付をMM/DD/YY形式にしたもの 11/04/21
%X 時刻をhh:mm:ss形式にしたもの 17:37:28
%a 曜日の短縮形 Thu
%A 曜日 Thursday
datetimeモジュールのdatetimeクラスのstrptimeメソッドで使える書式コード(一部)

 以下ではこれらを使って日付や時刻をパースする例を幾つか紹介する。

西暦が2桁で記述されている場合

 「21/11/24 12:34:56」のように、西暦が2桁で表記されているときには、書式コードに「%Y」ではなく「%y」を使用する。

str_date = '21/11/24 12:34:56'
mydate = datetime.strptime(str_date, '%y/%m/%d %H:%M:%S')
print(mydate)  # 2021-11-24 12:34:56


12時間制で時刻が記述されている

 時刻が12時間制で記述されている場合には、書式コードに「%H」ではなく「%I」を使用する。また、「%p」で午前/午後を示す文字列をパースできる。以下に例を示す。

str_date = '2021/11/24 01:23:45(PM)'
mydate = datetime.strptime(str_date, '%Y/%m/%d %I:%M:%S(%p)')
print(mydate)  # 021-11-24 13:23:45


 この例では、時刻の部分が「01:23:45(PM)」となっている。「PM」とあるから、これは「午後1時23分45秒」のことだ。そして、これを「%I:%M:%S(%p)」でパースした結果を見ると、確かに「13:23:45」となっている。

曜日を含んだ文字列表現

 文字列に曜日が含まれているときには、「%a」または「%A」でパースできる(前者は省略形、後者はフルスペル)。以下に例を示す。

str_date = '2021/11/24(Wed) 12:34:56'
mydate = datetime.strptime(str_date, '%Y/%m/%d(%a) %H:%M:%S')
idx = mydate.weekday()
day_of_week = '月火水木金土日'
print(f'{mydate} ({day_of_week[idx]})'# 2021-11-24 12:34:56 (水)


 この例では、生成されたdatetimeオブジェクトのweekdayメソッドを呼び出して、その戻り値(月曜日を0とする整数値)をインデックスに使い、月曜日から日曜日のいずれかに当てはまるかを確認している。

 なお、これはパースをするだけで、実際の曜日は日付から自動的に設定されると思われる。例えば、以下は上の例で日付はそのまま、曜日だけを「Thu」に変更したものだ。

str_date = '2021/11/24(Thu) 12:34:56'
mydate = datetime.strptime(str_date, '%Y/%m/%d(%a) %H:%M:%S')
idx = mydate.weekday()
day_of_week = '月火水木金土日'
print(f'{mydate} ({day_of_week[idx]})'# 2021-11-24 12:34:56 (水)


 この場合でも出力(つまり作成された曜日情報を保持するdatetimeオブジェクトの値)は「2021-11-24 12:34:56 (水)」となる。このことからは「2021年11月24日(水)」のような文字列を変換するとしたら、正規表現を利用するなどして、文字列から曜日部分を削除してしまうのが簡単な処理の方法と考えられる(コードは省略)。

タイムゾーン付き

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。