Pythonで文字列を日付時刻または時間オブジェクトに変換する方法を教えてください。
はじめまして。
Pythonのdatetimeモジュールとtimeモジュールの両方には、文字列をオブジェクトに変換するためのstrptime()クラスメソッドが含まれています。
この記事では、strptime()を使用して文字列を日付時刻オブジェクトやstruct_time()オブジェクトに変換します。
Info
datetime.strptime()を使用して、文字列をdatetimeオブジェクトに変換する。
datetime.strptime()メソッドの構文は次のようになります。
datetime.strptime(date_string, format)
datetime.strptime()メソッドは、フォーマットで解析されたdate_stringと一致するdatetimeオブジェクトを返します。両方の引数が必要であり、文字列である必要があります。
datetime.strptime()で使用される書式ディレクティブに関する詳細については、Pythonのドキュメントのstrftime()とstrptime()の書式コードを参照してください。
文字列をdatetime.datetime()オブジェクトに変換する例
以下の例では、日付と時刻の文字列をdatetime.datetime()オブジェクトに変換し、結果のオブジェクトのクラス名と値を表示します。
from datetime import datetime
datetime_str = '09/19/22 13:55:26'
datetime_object = datetime.strptime(datetime_str, '%m/%d/%y %H:%M:%S')
print(type(datetime_object))
print(datetime_object) # printed in default format
出力は:
<class 'datetime.datetime'>
2022-09-19 13:55:26
Stringをdatetime.date()オブジェクトに変換する例
次の例では、日付文字列をdatetime.date()オブジェクトに変換し、生成されたオブジェクトのクラスタイプと値を出力します。
from datetime import datetime
date_str = '09-19-2022'
date_object = datetime.strptime(date_str, '%m-%d-%Y').date()
print(type(date_object))
print(date_object) # printed in default format
出力は次のとおりです。
<class 'datetime.date'>
2022-09-19
「文字列をdatetime.time()オブジェクトに変換する例」
次の例では、時刻文字列をdatetime.time()オブジェクトに変換し、結果オブジェクトのクラスタイプと値を表示します。
from datetime import datetime
time_str = '13::55::26'
time_object = datetime.strptime(time_str, '%H::%M::%S').time()
print(type(time_object))
print(time_object)
出力は次の通りです:
<class 'datetime.time'>
13:55:26
文字列をロケールの例として、datetime.datetime()オブジェクトに変換する方法
以下の例では、ドイツのロケールの日付文字列をdatetime.datetime()オブジェクトに変換し、結果のオブジェクトのクラスタイプと値を表示します。
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
date_str_de_DE = '16-Dezember-2022 Freitag' # de_DE locale
datetime_object = datetime.strptime(date_str_de_DE, '%d-%B-%Y %A')
print(type(datetime_object))
print(datetime_object)
出力は以下の通りです。
<class 'datetime.datetime'>
2022-12-16 00:00:00
入力文字列から得られるオブジェクトには、日付の曜日の名前は含まれていないことに注意してください。なぜなら、datetime.datetime()オブジェクトには曜日が10進数の形式でのみ含まれているからです。
time.strptime()を使用して、文字列をstruct_time()オブジェクトに変換する
time.strptime() メソッドの構文は次の通りです。
time.strptime(time_string[, format])
time.strptime()メソッドは、フォーマットで解析されたtime_stringに一致するtime.struct_time()オブジェクトを返します。time_stringは必須で、両引数はどちらも文字列である必要があります。フォーマットが指定されていない場合、デフォルトは次のようになります:
'%a %b %d %H:%M:%S %Y'
これは、ctime()関数が返す形式に対応しています。
time.strptime()とtime.strftime()のフォーマットディレクティブは同じです。Pythonのドキュメンテーションで、timeモジュールのフォーマットディレクティブについて詳しく学びましょう。
指定された形式の例を使用して、文字列をstruct_time()オブジェクトに変換する。
次の例では、フォーマット引数を指定して、時間文字列をtime.struct_time()オブジェクトに変換し、変換されたオブジェクトの値を出力します。
import time
time_str = '11::33::54'
time_obj = time.strptime(time_str, '%H::%M::%S')
print("A time.struct_time object that uses the format provided:")
print(time_obj)
出力は次の通りです:
A time.struct_time object that uses the format provided:
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1,
tm_hour=11, tm_min=33, tm_sec=54, tm_wday=0, tm_yday=1,
tm_isdst=-1)
出力に示されているように、文字列をtime.struct_time()オブジェクトに変換する際、strptime()メソッドはフォーマット引数に定義されていないフォーマット指令に対してはプレースホルダー値を使用します。
デフォルトのフォーマット例を使用して、文字列をstruct_time()オブジェクトに変換する方法
時間文字列をtime.struct_time()オブジェクトに変換する際に、フォーマット引数を指定しない場合、デフォルトのフォーマットが使用され、入力文字列がデフォルトのフォーマットと完全に一致しない場合にエラーが発生します。
'%a %b %d %H:%M:%S %Y'
次の例では、フォーマット引数が指定されていない場合に、時間文字列をtime.struct_time()オブジェクトに変換し、その結果のオブジェクトの値を表示します。
import time
# default format - "%a %b %d %H:%M:%S %Y"
time_str_default = 'Mon Dec 12 14:55:02 2022'
time_obj_default = time.strptime(time_str_default)
print("A time.struct_time object that uses the default format:")
print(time_obj_default)
出力は:
A time.struct_time object that uses the default format:
time.struct_time(tm_year=2022, tm_mon=12, tm_mday=12,
tm_hour=14, tm_min=55, tm_sec=2, tm_wday=0, tm_yday=346,
tm_isdst=-1)
出力に示されているように、文字列をtime.struct_time()オブジェクトに変換する場合、strptime()メソッドは、フォーマット引数に定義されていない形式指示子に対してプレースホルダ値を使用します。指定されていない場合は、デフォルトの形式によってプレースホルダ値が使用されます。
strptime()のエラーのトラブルシューティング
与えられたフォーマットでstrptime()が入力文字列を解析できない場合、ValueErrorが発生します。パースエラーをテストするためにtryブロックを使用し、結果を出力するためにexceptブロックを使用できます。strptime()メソッドを使用する際に得られるValueErrorメッセージは、パースエラーの原因を明確に説明しています。以下の例は、余分なデータやフォーマットの不一致などの一般的なエラーを示しています。
from datetime import datetime
import time
datetime_str = '09/19/18 13:55:26'
try:
datetime_object = datetime.strptime(datetime_str, '%m/%d/%y')
except ValueError as ve1:
print('ValueError 1:', ve1)
time_str = '99::55::26'
try:
time_object = time.strptime(time_str, '%H::%M::%S')
except ValueError as ve2:
print('ValueError 2:', ve2)
出力は次のとおりです。
ValueError 1: unconverted data remains: 13:55:26
ValueError 2: time data '99::55::26' does not match format '%H::%M::%S'
結論 (けつろん)
このチュートリアルでは、Pythonを使用して日付と時刻の文字列をdatetimeおよびtimeオブジェクトに変換しました。さらにPythonのチュートリアルで学習を続けましょう。