[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関数
で使用するフォーマット指定子は、日付や時間の各部分を表すために使われます。
以下はよく使われる指定子の一覧です。
指定子 | 説明 |
---|---|
%Y | 4桁の年 |
%m | 2桁の月(01-12) |
%d | 2桁の日(01-31) |
%H | 24時間制の時(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型
に変換することができます。
よく使うフォーマット指定子
年・月・日を表す指定子
日付を表すためのフォーマット指定子は、年、月、日をそれぞれ表現するために使用されます。
以下の指定子が一般的です。
指定子 | 説明 |
---|---|
%Y | 4桁の年(例:2023) |
%y | 2桁の年(例:23) |
%m | 2桁の月(01-12) |
%d | 2桁の日(01-31) |
時間・分・秒を表す指定子
時間を表すためのフォーマット指定子は、時、分、秒を表現するために使用されます。
以下の指定子が一般的です。
指定子 | 説明 |
---|---|
%H | 24時間制の時(00-23) |
%I | 12時間制の時(01-12) |
%M | 分(00-59) |
%S | 秒(00-59) |
%p | AMまたはPM |
曜日や月名を表す指定子
曜日や月名を表すためのフォーマット指定子は、以下のようになります。
指定子 | 説明 |
---|---|
%A | 曜日名(例:Monday) |
%a | 曜日名の省略形(例:Mon) |
%B | 月名(例:January) |
%b | 月名の省略形(例:Jan) |
タイムゾーンを表す指定子
タイムゾーンを扱うためのフォーマット指定子は、以下のようになります。
指定子 | 説明 |
---|---|
%Z | タイムゾーン名(例:UTC) |
%z | UTCオフセット(例:+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
モジュールや関連ライブラリを使った日付や時間の操作がどのように行えるかを理解することができます。
必要に応じて、これらの手法を活用して、さまざまな日付処理を行うことが可能です。
よくある質問
まとめ
この記事では、Pythonのdatetime
モジュールを使用して、日付や時間の文字列をdatetime型
に変換する方法について詳しく解説しました。
具体的には、基本的な変換方法から、エラーハンドリング、応用例に至るまで、さまざまなテクニックを紹介しました。
これらの知識を活用して、日付や時間のデータを効果的に処理し、プログラムの精度を向上させることができるでしょう。
ぜひ、実際のプロジェクトやデータ処理の場面で、これらのテクニックを試してみてください。