そこで今日は、Pythonのstrptime()メソッドを使って、文字列をdatetimeに変換する方法について説明します。
さっそく始めてみましょう。
この記事もチェック:Pythonでtitleメソッドを使って小文字と大文字を変換する方法
Python strptime() メソッド
Python の strptime() メソッドは datetime と time の両方のモジュールで利用可能です。
このメソッドは、与えられた文字列を指定されたフォーマットに従って datetime または time オブジェクトにパースするために使用されます。
この関数の使い方はどちらのモジュールでもほぼ同じですが、唯一異なるのは返されるオブジェクトの型です。
この関数を使用するための構文を詳しく見てみましょう。
datetimeモジュールでは、strptime() メソッドを使うためのシンタックスは以下のとおりです。
datetime.strptime(date_string, format)
|
上記の文は、指定されたフォーマットに従ってパースされた date_string に対応する datetime オブジェクトを返す。
time モジュールについても、 strptime() のシンタックスはほぼ同じです。
time.strptime(string[, format])
|
ここでは、このメソッドは同じ処理を行いますが、返される値は gmtime() または localtime() が返す struct_time オブジェクトと同じです。
どちらの場合も、format パラメータには strftime() が使用するものと同じディレクティブが使用されます。
formatパラメータは文字列でなければならず、デフォルト値として "%a %b %d %H:%M:%S %Y" が設定されています。
文字列が与えられたフォーマットに従ってパースできない場合、あるいはパース後に余分なデータがある場合、 ValueError が発生します。
この記事もチェック:Pythonの文字列フォーマット|f文字列やformat関数等での使い方
フォーマット表
以下のフォーマット表に従って、formatパラメータを指定する際に適切なディレクティブを使用する必要があります。
| ディレクティブ|ディレクティブの意味|出力例|||||など
| A|ロケールのフルネームとして曜日を指定。
| 水曜日
| %a ロケールの短縮形としての曜日。
| 月、火、水
| w|曜日を10進数で表し、0が日曜日、6が土曜日を表します。
| 0,1,2,3,4…6 |
| %d | ゼロパッドの10進数で表した月の日。
| 01,02,03…31 |
| %-d | 10進数で表した月の日。
(プラットフォーム固有) | 1,2,3…。
| b|ロケールの省略名としての月。
| Mar
| B|ロケールの完全な名前としての月。
| March|マーチ
| m|月を表す、ゼロパッドの10進数。
| 01,02…12 |
| m|月を表す10進数。
(プラットフォーム固有) | 1,2,…12 | %y | センチュリーを含まない年。
| y|ゼロパッドの10進数で表した世紀のない年。
| 20(2020年)の場合。
| Y|センチュリーを10進数で表した年。
| 2020, 2021, など。
|
| H|時間(24時間表示)を表す10進数。
| 01, 02, … |
| H|時間(24時間表示)を10進数で表示。
(プラットフォーム固有) | 1,2,3,….
| I|ゼロパッドされた10進数としての時間(12時間時計)。
| 01, 02, 03, … |
| %I | 時刻(12時間表示)を10進数で表示。
(プラットフォーム固有) | 1, 2, 3 … | ロケール固有。
| p|ロケールのAMまたはPMの等価値。
| AM、PM
| M|ゼロパッドの10進数としての分。
| 01, 02, …59 |
| M|10進数で表記された分。
(プラットフォーム固有) | 1,2,3,…59 | %S。
| S|ゼロパッドの10進数で表した秒数。
| 01, 02,…59 |
| S|2桁目を10進数で表します。
(プラットフォーム固有) | 1, 2, …59 | %F
| f|10進数としてのマイクロ秒、左側はゼロパット。
| 000000 |
| z|+HHMMまたは-HHMM形式のUTCオフセット(オブジェクトがナイーブな場合は空文字列)。
| (空)、+0000、-0400、+1030|。
| %Z | タイム・ゾーン名 (オブジェクトが単純な場合は空文字列)。
| (空)、UTC、IST、CST|。
| %j | ゼロ・パディングされた 10 進数としての今年の日。
| 1, 2, 3, … 366 |
| %-j | 10進数で表したその年の日。
(プラットフォーム固有) | 1, 2, 3, … 366|。
| U|ゼロパッドの10進数としてのその年の週番号(日曜日を週の初日とする)。
最初の日曜日に先立つ新しい年のすべての日は、第0週であるとみなされます。
| 1, 2, 3,… 53 |
| W|10進数で表したその年の週番号(月曜日を週の初日とする)。
新しい年の最初の月曜日より前の日はすべて第0週とみなされます。
| 1, 2, 3,… 53 |
| c|ロケールの適切な日付と時間の表現。
| Wed May 06 12:23:56 2020 | ロケールの適切な日付と時間の表現。
| %x | ロケールの適切な日付表現。
| 05/06/20 |
| %X | ロケールの適切な時間表現。
| 12:23:56 |
| %% | リテラルの’%’文字。
ソースはこちら Strftime() Official Homepage## strptime() メソッドの使用法
さて、datetime と time モジュールの両方で strptime() メソッドを使う構文に慣れたところで、これをどのように使うか見てみましょう。
1. time.strptime()
以下の例では、与えられた文字列を時間オブジェクトに変換しています。
import time
time_string = "06/05/2020 12:06:58"
obj = time.strptime(time_string, "%d/%m/%Y %H:%M:%S")
print(type(obj))
print(obj)
#parsing using default formatting: %a %b %d %H:%M:%S %Ydef_obj = time.strptime("Wed May 06 12:06:58 2020")
print(def_obj)
|
結果を出力すると、以下の様になります。
<class 'time.struct_time'>
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=6, tm_hour=12, tm_min=6, tm_sec=58, tm_wday=2, tm_yday=127, tm_isdst=-1)
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=6, tm_hour=12, tm_min=6, tm_sec=58, tm_wday=2, tm_yday=127, tm_isdst=-1)
|
ここで、time_string は対応する時間パラメータを含む与えられた文字列です。
strptime() 関数を用いて、”%d/%m/%Y %H:%M:%S” のフォーマットでこの文字列を解析し、変数 obj に格納します。
予想通り、objはtime.struct_time型です。
次に、別の文字列をデフォルトのフォーマットで解析しています(formatパラメータを指定しない場合)。
先に述べたように、この場合、デフォルトのフォーマットは %a %b %d %H:%M:%S %Y に設定されています。
これは出力を正当化するものです。
2. datetime.strptime()
では、strptime() メソッドを使って、与えられた文字列をdatetimeオブジェクトに変換してみましょう。
from datetime import datetime
dt_string = "06//05//2020 12:06:58"
obj = datetime.strptime(dt_string, "%d//%m//%Y %H:%M:%S")
print(type(obj))
print("DateTime object: ", obj)
print("Time object: ", obj.time())
print("Date object: ", obj.date())
|
結果は以下の通りです。
from datetime import datetime
dt_string = str(input("Enter date in dd:mm:yyyy format:"))
try:
obj = datetime.strptime(dt_string, "%d:%m:%Y")
print(obj)
print(obj.strftime("Date:%d Month:%m Year:%Y")) #strftime to format datetime obj
except ValueError as ex:
print("ValueError: ", ex)
|
上の出力からわかるように、 dt_string は正常に datetime オブジェクトに変換されます。
また、このオブジェクトに対して time() と date() 関数を使用して、それぞれ datetime.time と datetime.date オブジェクトを取得することができます。
input()関数を用いて、ユーザーから日付と時刻を取得する例を見てみましょう。
Enter date in dd:mm:yyyy format:6/5/20
ValueError: time data '6/5/20' does not match format '%d:%m:%Y'
|
結果は以下の通りです。

この例では、ユーザー入力として dt_string を受け取り、それを strptime() メソッドを使って datetime オブジェクトに変換しています。
再び、このオブジェクトを受け取り、 strftime() メソッドを使って希望のフォーマットで表示します。
もし、strptime()メソッドに指定した書式に合致する文字列を与えられなかったらどうなるでしょうか?この場合、ValueError が発生します。
以下の出力(同じコード)を見てください。

Summing Up
今日は strptime() メソッドを使って、Pythonで文字列を様々な型に変換することについて学びました。
このトピックに関する更なる質問があれば、以下のコメント欄からお気軽にどうぞ。
この記事もチェック:Pythonでlowerメソッドを使って文字列を全て小文字に変換する方法
参考文献
- Pythonのstrftime()関数とは?
- Pythonのtimeモジュールです。
- time strptime() – Python ドキュメント,
- datetime strptime() – Python ドキュメント.