Pythonで文字列を日時または時間オブジェクトに変換する方法

イントロダクション

Pythonのdatetimeおよびtimeモジュールには、文字列をオブジェクトに変換するためのstrptime()クラスメソッドが含まれています。

この記事では、strptime()を使用して文字列をdatetimeおよびstruct_time()オブジェクトに変換します。

DigitalOcean App Platformを使用してGitHubからPythonアプリケーションをデプロイしましょう。DigitalOceanがアプリのスケーリングに集中します。

datetime.strptime()を使用して文字列をdatetimeオブジェクトに変換する

datetime.strptime()メソッドの構文は次のようになります:

datetime.strptime(date_string, format)

datetime.strptime()メソッドは、date_stringformatで解析して一致する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)  # デフォルトの書式で出力

出力結果は次の通りです:

<class 'datetime.datetime'>
2022-09-19 13:55:26

文字列を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)  # デフォルトの書式で出力

出力結果は次の通りです:

<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ロケール
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_stringformatで解析した結果に対応するtime.struct_time()オブジェクトを返します。time_stringは必須で、両引数はどちらも文字列である必要があります。もしformatが指定されない場合、デフォルトは次のようになります:

'%a %b %d %H:%M:%S %Y'

これはctime()関数が返すフォーマットに対応しています。

フォーマットディレクティブは、time.strptime()time.strftime()で同じです。Pythonのドキュメントでtimeモジュールのフォーマットディレクティブについて詳しく学びましょう。

指定されたフォーマットで文字列をstruct_time()オブジェクトに変換する例

次の例では、format引数を指定して時間文字列を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()メソッドはformat引数で定義されていないフォーマットディレクティブに対してプレースホルダーの値を使用します。

デフォルトのフォーマットを使用して、文字列をstruct_time()オブジェクトに変換する例

時間の文字列をtime.struct_time()オブジェクトに変換する際に、format引数を指定しない場合、デフォルトのフォーマットが使用され、入力文字列がデフォルトのフォーマットと完全に一致しない場合にエラーが発生します:

 '%a %b %d %H:%M:%S %Y'

次の例では、format引数を指定せずに、時間の文字列をtime.struct_time()オブジェクトに変換し、結果オブジェクトの値を表示しています:

import time

# デフォルトのフォーマット - "%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()メソッドは、format引数で定義されていないフォーマット指示子にはプレースホルダーの値を使用します。また、formatが指定されていない場合はデフォルトのフォーマットが使用されます。

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チュートリアルで学習を続けてください。

Source:
https://www.digitalocean.com/community/tutorials/python-string-to-datetime-strptime