[Python] 日付や時間の文字列を日付型(datetime)に変換する方法

Pythonで日付や時間の文字列を日付型(datetimeオブジェクト)に変換するには、datetimeモジュールのstrptime関数を使用します。

strptimeは、指定したフォーマットに従って文字列を解析し、datetimeオブジェクトを返します。

例えば、datetime.strptime("2023-10-01", "%Y-%m-%d")のように使用します。

フォーマット指定子には、年は%Y、月は%m、日は%dなどが使われます。

この記事でわかること
  • datetimeモジュールの基本的な使い方
  • 日付や時間の文字列を変換する方法
  • フォーマット指定子の種類と使い方
  • エラーハンドリングの手法
  • pandasやdateutilの活用法

目次から探す

日付や時間の文字列をdatetimeに変換する基本

datetimeモジュールとは

datetimeモジュールは、Pythonで日付や時間を扱うための標準ライブラリです。

このモジュールを使用することで、日付や時間の計算、フォーマットの変換、タイムゾーンの管理などが簡単に行えます。

主に以下のクラスが含まれています。

スクロールできます
クラス名説明
datetime日付と時間を表すクラス
date日付(年、月、日)を表すクラス
time時間(時、分、秒、マイクロ秒)を表すクラス
timedelta日付や時間の差を表すクラス
tzinfoタイムゾーン情報を表すクラス

strptime関数の基本的な使い方

strptime関数は、文字列を指定したフォーマットに基づいてdatetimeオブジェクトに変換するためのメソッドです。

以下のように使用します。

from datetime import datetime
# 文字列をdatetimeに変換
date_string = "2023-10-01 14:30:00"
date_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(date_object)
2023-10-01 14:30:00

フォーマット指定子の一覧

strptime関数で使用するフォーマット指定子は、日付や時間の各部分を表すために使われます。

以下はよく使われる指定子の一覧です。

スクロールできます
指定子説明
%Y4桁の年
%m2桁の月(01-12)
%d2桁の日(01-31)
%H24時間制の時(00-23)
%M分(00-59)
%S秒(00-59)
%A曜日名(英語)
%B月名(英語)

例:日付文字列をdatetimeに変換する

以下の例では、日付文字列をdatetimeオブジェクトに変換します。

from datetime import datetime
# 日付文字列
date_string = "2023-10-01"
# 変換
date_object = datetime.strptime(date_string, "%Y-%m-%d")
print(date_object)
2023-10-01 00:00:00

例:時間文字列をdatetimeに変換する

次に、時間のみの文字列をdatetimeオブジェクトに変換する例です。

from datetime import datetime
# 時間文字列
time_string = "14:30:00"
# 変換
time_object = datetime.strptime(time_string, "%H:%M:%S")
print(time_object)
1900-01-01 14:30:00

このように、datetimeモジュールを使うことで、日付や時間の文字列を簡単にdatetime型に変換することができます。

よく使うフォーマット指定子

年・月・日を表す指定子

日付を表すためのフォーマット指定子は、年、月、日をそれぞれ表現するために使用されます。

以下の指定子が一般的です。

スクロールできます
指定子説明
%Y4桁の年(例:2023)
%y2桁の年(例:23)
%m2桁の月(01-12)
%d2桁の日(01-31)

時間・分・秒を表す指定子

時間を表すためのフォーマット指定子は、時、分、秒を表現するために使用されます。

以下の指定子が一般的です。

スクロールできます
指定子説明
%H24時間制の時(00-23)
%I12時間制の時(01-12)
%M分(00-59)
%S秒(00-59)
%pAMまたはPM

曜日や月名を表す指定子

曜日や月名を表すためのフォーマット指定子は、以下のようになります。

スクロールできます
指定子説明
%A曜日名(例:Monday)
%a曜日名の省略形(例:Mon)
%B月名(例:January)
%b月名の省略形(例:Jan)

タイムゾーンを表す指定子

タイムゾーンを扱うためのフォーマット指定子は、以下のようになります。

スクロールできます
指定子説明
%Zタイムゾーン名(例:UTC)
%zUTCオフセット(例:+0900)

ミリ秒やマイクロ秒を扱う方法

ミリ秒やマイクロ秒を扱うためのフォーマット指定子は、以下のようになります。

スクロールできます
指定子説明
%fマイクロ秒(000000-999999)
%fミリ秒は通常、マイクロ秒を3桁に切り取ることで表現されます。

これらのフォーマット指定子を使用することで、日付や時間の文字列を柔軟に扱うことができます。

必要に応じて、これらの指定子を組み合わせて使用することが可能です。

実践的な例

日付と時間を含む文字列を変換する

日付と時間が含まれる文字列をdatetimeオブジェクトに変換する例です。

以下のコードでは、日付と時間を含む文字列を変換しています。

from datetime import datetime
# 日付と時間の文字列
datetime_string = "2023-10-01 14:30:00"
# 変換
datetime_object = datetime.strptime(datetime_string, "%Y-%m-%d %H:%M:%S")
print(datetime_object)
2023-10-01 14:30:00

12時間制の時間を変換する

12時間制の時間を含む文字列をdatetimeオブジェクトに変換する例です。

AM/PMを考慮して変換します。

from datetime import datetime
# 12時間制の時間文字列
time_string = "02:30 PM"
# 変換
time_object = datetime.strptime(time_string, "%I:%M %p")
print(time_object)
1900-01-01 14:30:00

タイムゾーン付きの文字列を変換する

タイムゾーン情報を含む文字列をdatetimeオブジェクトに変換する例です。

以下のコードでは、UTCオフセットを含む文字列を変換しています。

from datetime import datetime
# タイムゾーン付きの文字列
tz_string = "2023-10-01 14:30:00 +0900"
# 変換
tz_object = datetime.strptime(tz_string, "%Y-%m-%d %H:%M:%S %z")
print(tz_object)
2023-10-01 14:30:00+09:00

不完全な日付文字列を補完して変換する

不完全な日付文字列を補完して変換する例です。

ここでは、年が省略されている場合を考えます。

from datetime import datetime
# 不完全な日付文字列
incomplete_date_string = "10-01"
# 現在の年を取得
current_year = datetime.now().year
# 補完して変換
complete_date_string = f"{current_year}-{incomplete_date_string}"
date_object = datetime.strptime(complete_date_string, "%Y-%m-%d")
print(date_object)
2023-10-01 00:00:00

日本語の曜日や月名を含む文字列を変換する

日本語の曜日や月名を含む文字列を変換する例です。

localeモジュールを使用して日本語の設定を行います。

import locale
from datetime import datetime
# 日本語のロケールを設定
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
# 日本語の月名を含む文字列
japanese_date_string = "2023年10月01日"
# 変換
japanese_date_object = datetime.strptime(japanese_date_string, "%Y年%m月%d日")
print(japanese_date_object)
2023-10-01 00:00:00

これらの実践的な例を通じて、さまざまな形式の日付や時間の文字列をdatetimeオブジェクトに変換する方法を学ぶことができます。

必要に応じて、これらの手法を応用して、特定の要件に合わせた変換を行うことが可能です。

文字列からdatetimeへの変換時のエラーハンドリング

無効な日付文字列を処理する方法

無効な日付文字列を処理するためには、strptime関数を使用する際に、入力が正しい形式であるかを確認する必要があります。

無効な日付文字列が与えられた場合、ValueErrorが発生します。

以下の例では、無効な日付文字列を処理する方法を示します。

from datetime import datetime
# 無効な日付文字列
invalid_date_string = "2023-02-30"
try:
    # 変換を試みる
    date_object = datetime.strptime(invalid_date_string, "%Y-%m-%d")
except ValueError as e:
    print(f"エラー: {e}")
エラー: day is out of range for month

フォーマットが一致しない場合の対処法

フォーマットが一致しない場合もValueErrorが発生します。

この場合、エラーメッセージを表示することで、どのような問題があったのかを把握できます。

以下の例では、フォーマットが一致しない場合の対処法を示します。

from datetime import datetime
# フォーマットが一致しない日付文字列
mismatched_format_string = "01-10-2023"
try:
    # 変換を試みる
    date_object = datetime.strptime(mismatched_format_string, "%Y-%m-%d")
except ValueError as e:
    print(f"エラー: {e}")
エラー: time data '01-10-2023' does not match format '%Y-%m-%d'

try-exceptを使ったエラーハンドリング

try-except構文を使用することで、エラーが発生した場合でもプログラムがクラッシュせずに処理を続けることができます。

以下の例では、try-exceptを使ったエラーハンドリングの方法を示します。

from datetime import datetime
# 日付文字列のリスト
date_strings = ["2023-10-01", "2023-02-30", "01-10-2023"]
for date_string in date_strings:
    try:
        # 変換を試みる
        date_object = datetime.strptime(date_string, "%Y-%m-%d")
        print(f"変換成功: {date_object}")
    except ValueError as e:
        print(f"エラー: {e} - 入力: {date_string}")
変換成功: 2023-10-01 00:00:00
エラー: day is out of range for month - 入力: 2023-02-30
エラー: time data '01-10-2023' does not match format '%Y-%m-%d' - 入力: 01-10-2023

デフォルト値を設定する方法

エラーが発生した場合にデフォルト値を設定することで、プログラムの動作を安定させることができます。

以下の例では、無効な日付文字列が与えられた場合にデフォルトの日付を設定しています。

from datetime import datetime
# 無効な日付文字列
invalid_date_string = "2023-02-30"
default_date = datetime(2023, 1, 1)  # デフォルト値
try:
    # 変換を試みる
    date_object = datetime.strptime(invalid_date_string, "%Y-%m-%d")
except ValueError:
    date_object = default_date
    print(f"無効な日付のためデフォルト値を使用: {date_object}")
無効な日付のためデフォルト値を使用: 2023-01-01 00:00:00

これらのエラーハンドリングの手法を使用することで、日付や時間の文字列を安全にdatetimeオブジェクトに変換することができ、プログラムの信頼性を向上させることができます。

応用例

pandasで日付文字列をdatetimeに変換する

pandasライブラリを使用すると、大量の日付データを簡単にdatetime型に変換できます。

pd.to_datetime()関数を使うことで、さまざまな形式の日付文字列を一括で変換できます。

以下の例を見てみましょう。

import pandas as pd
# 日付文字列のリスト
date_strings = ["2023-10-01", "2023/10/02", "2023年10月03日"]
# 変換
date_series = pd.to_datetime(date_strings)
print(date_series)
DatetimeIndex(['2023-10-01', '2023-10-02', '2023-10-03'], dtype='datetime64[ns]', freq=None)

dateutilモジュールを使った柔軟な変換

dateutilモジュールは、日付の解析をより柔軟に行うためのライブラリです。

特に、異なるフォーマットの日付文字列を自動的に認識して変換することができます。

以下の例では、dateutil.parserを使用して日付文字列を変換します。

from dateutil import parser
# 異なるフォーマットの日付文字列
date_strings = ["2023-10-01", "10/02/2023", "October 3, 2023"]
# 変換
date_objects = [parser.parse(date_string) for date_string in date_strings]
print(date_objects)
[datetime.datetime(2023, 10, 1, 0, 0), datetime.datetime(2023, 10, 2, 0, 0), datetime.datetime(2023, 10, 3, 0, 0)]

timeモジュールとの違いと使い分け

timeモジュールは、主に時間に関する機能を提供しますが、日付の操作にはdatetimeモジュールを使用するのが一般的です。

timeモジュールは、時間の取得やスリープなどの機能に特化しています。

以下の例では、timeモジュールを使って現在の時刻を取得します。

import time
# 現在の時刻を取得
current_time = time.localtime()
print(time.strftime("%H:%M:%S", current_time))
14:30:00

日付型を再び文字列に変換する方法

datetimeオブジェクトを再び文字列に変換するには、strftimeメソッドを使用します。

以下の例では、datetimeオブジェクトを指定したフォーマットの文字列に変換します。

from datetime import datetime
# datetimeオブジェクト
date_object = datetime(2023, 10, 1, 14, 30)
# 文字列に変換
date_string = date_object.strftime("%Y-%m-%d %H:%M:%S")
print(date_string)
2023-10-01 14:30:00

日付の計算や比較に応用する

datetimeオブジェクトを使用すると、日付の計算や比較が簡単に行えます。

以下の例では、日付の差を計算し、比較を行っています。

from datetime import datetime, timedelta
# 2つの日付
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 15)
# 日付の差を計算
difference = date2 - date1
print(f"日付の差: {difference.days}日")
# 日付の比較
if date1 < date2:
    print("date1はdate2より前の日付です。")
else:
    print("date1はdate2より後の日付です。")
日付の差: 14日
date1はdate2より前の日付です。

これらの応用例を通じて、datetimeモジュールや関連ライブラリを使った日付や時間の操作がどのように行えるかを理解することができます。

必要に応じて、これらの手法を活用して、さまざまな日付処理を行うことが可能です。

よくある質問

strptimeでエラーが出るのはなぜ?

strptimeでエラーが出る主な理由は、入力された日付文字列が指定したフォーマットと一致しない場合です。

例えば、日付の形式が"%Y-%m-%d"であるのに、"01-10-2023"のように異なる形式で入力すると、ValueErrorが発生します。

また、無効な日付(例:2023年2月30日)を指定した場合もエラーが発生します。

エラーメッセージを確認することで、具体的な問題を特定できます。

フォーマット指定子が正しいか確認する方法は?

フォーマット指定子が正しいか確認するためには、Pythonの公式ドキュメントを参照するのが最も確実です。

特に、datetimeモジュールのstrptimeメソッドに関するセクションには、使用可能なフォーマット指定子の一覧が記載されています。

また、実際に簡単なテストコードを実行して、期待通りに動作するかを確認することも有効です。

例えば、特定のフォーマットで日付を変換してみて、エラーが発生しないかをチェックします。

タイムゾーンを含む文字列を変換するにはどうすればいい?

タイムゾーンを含む文字列を変換するには、datetimeモジュールのstrptimeメソッドを使用し、フォーマットに%zを追加します。

これにより、UTCオフセットを含む日付文字列を正しく解析できます。

例えば、"2023-10-01 14:30:00 +0900"のような文字列を変換する場合、以下のようにします。

from datetime import datetime
# タイムゾーン付きの文字列
tz_string = "2023-10-01 14:30:00 +0900"
# 変換
tz_object = datetime.strptime(tz_string, "%Y-%m-%d %H:%M:%S %z")
print(tz_object)

このようにすることで、タイムゾーン情報を含む日付文字列を正しくdatetimeオブジェクトに変換することができます。

まとめ

この記事では、Pythonのdatetimeモジュールを使用して、日付や時間の文字列をdatetime型に変換する方法について詳しく解説しました。

具体的には、基本的な変換方法から、エラーハンドリング、応用例に至るまで、さまざまなテクニックを紹介しました。

これらの知識を活用して、日付や時間のデータを効果的に処理し、プログラムの精度を向上させることができるでしょう。

ぜひ、実際のプロジェクトやデータ処理の場面で、これらのテクニックを試してみてください。

  • URLをコピーしました!
目次から探す