Pythonお悩み解決

Pythonに関する疑問や悩みにこたえるブログです

日時を表す文字列を日時データに変換したい

Pythonで「日時を表す文字列を日時データに変換する方法」を解説します。

Pythonで文字列を日時データを文字列に変換するには、主に2つの方法があります。

それぞれ見ていきましょう。

1. fromisoformat()メソッドを使う

まずは、ISO 8601書式で表された日時の文字列を日時データに変換する方法です。

ISO 8601書式では、たとえば年-月-日T時:分:秒のように日時を表します(他にもバリエーションがあります)。

このISO 8601書式の文字列を日時データに変換するには、fromisoformat()メソッドが使えます

fromisoformat()datetimeクラスのクラスメソッドで、Python 3.7で追加されました。

このメソッドの使い方は以下の通りです。

datetime.fromisoformat(ISO書式の文字列)

なおfromisoformat()datetimeクラスだけなく、dateクラスとtimeクラスでも使えます。

各クラスの使用例を見ていきましょう。

datetime.fromisoformat()の例

datetimeクラスの場合、たとえば以下のような文字列をdatetimeオブジェクトに変換できます。

>>> from datetime import datetime
>>> # "2022-07-06T12:34:56" を datetime型 に変換
>>> datetime.fromisoformat("2022-07-06T12:34:56")
datetime.datetime(2022, 7, 6, 12, 34, 56)
>>> # "2022-07-06 12:34:56.789" を datetime型 に変換
>>> datetime.fromisoformat("2022-07-06 12:34:56.789")
datetime.datetime(2022, 7, 6, 12, 34, 56, 789000)
>>> # "2022-07-06" を datetime型 に変換
>>> datetime.fromisoformat("2022-07-06")
datetime.datetime(2022, 7, 6, 0, 0)

date.fromisoformat()の例

dateクラスの場合は、年-月-日という書式の文字列をdateオブジェクトに変換できます。

>>> from datetime import date
>>> # "2022-07-06" を date型 に変換
>>> date.fromisoformat("2022-07-06")
datetime.date(2022, 7, 6)

time.fromisoformat()の例

timeクラスの場合は、時:分:秒時:分:秒.マイクロ秒のような時刻の文字列をtimeオブジェクトに変換できます。

>>> from datetime import time
>>> # "12:34:56" を time型 に変換
>>> time.fromisoformat("12:34:56")
datetime.time(12, 34, 56)
>>> # "12:34:56.789" を time型 に変換
>>> time.fromisoformat("12:34:56.789")
datetime.time(12, 34, 56, 789000)
>>> # "12:34:56.778899" を time型 に変換
>>> time.fromisoformat("12:34:56.778899")
datetime.time(12, 34, 56, 778899)

文字列の書式が合わない場合

文字列がISO 8601書式に合わない場合は、ValueErrorが発生します。

>>> datetime.fromisoformat("2022/07/06")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid isoformat string: '2022/07/06'

このように「不正なISO書式の文字列(Invalid isoformat string)」というエラーメッセージが表示されます。

isoformat()との関係

fromisoformat()メソッドはisoformat()メソッドの逆関数(入力と出力が逆になる関数)となっています。

そのため、fromisoformat()メソッドで変換できるのは、isoformat()メソッドで出力される書式の文字列だけです。

ISO 8601書式は上記以外にもいくつか書き方がありますが、それら全ての書き方に対応しているわけではないことに注意しましょう。

isoformat()については、別の記事で解説していますので、末尾の「関連記事」をご参照ください。

2. strptime()メソッドを使う

任意の書式の文字列を日時データに変換したい場合は、datetimeクラスのstrptime()メソッドを使います

このメソッドの使い方は以下の通りです。

datetime.strptime(日時の文字列, 書式)

書式は、以下のように書式化指定子を使って任意の書式を指定できます。

>>> from datetime import datetime
>>> # "年/月/日 時:分:秒" という書式の文字列を変換
>>> datetime.strptime("2022/07/06 12:34:56", "%Y/%m/%d %H:%M:%S")
datetime.datetime(2022, 7, 6, 12, 34, 56)

%Y%mの部分が書式化指定子です。

時刻を含まない場合、以下のようにdatetimeオブジェクトの時刻部分は0になります。

>>> # "年/月/日" という書式の文字列を変換
>>> datetime.strptime("2022/07/06", "%Y/%m/%d")
datetime.datetime(2022, 7, 6, 0, 0)

よく使う書式指定子は以下のようなものがあります。

書式指定子 意味 使用例
%Y 西暦(4桁) 0001, 0002, ..., 2022, 2023, ..., 9998, 9999
%y 西暦(2桁) 00, 01, ..., 99
%m 01, 02, ..., 12
%B 月名 January, February, ..., December
%b 月名(短縮系) Jan, Feb, ..., Dec
%d 日にち 01, 02, ..., 31
%A 曜日名 Sunday, Monday, ..., Saturday
%a 曜日名(短縮系) Sun, Mon, ..., Sat
%H 時(24時間表記) 00, 01, ..., 23
%I 時(12時間表記) 01, 02, ..., 12
%p AM/PM AM, PM
%M 00, 01, ..., 59
%S 00, 01, ..., 59
%f マイクロ秒 000000, 000001, ..., 999999

なお、strptime()datetimeクラスのみに存在し、dateクラスやtimeクラスには存在しません。

文字列の書式が合わない場合

文字列が指定した書式と合わないとVallueErrorが発生します。

>>> datetime.strptime("2022-07-06", "%Y/%m/%d")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '2022-07-06' does not match format '%Y/%m/%d'

このように「書式が合ってない(does not match format)」というエラーメッセージが表示されます。

メソッド名の覚え方:strptime()pとは

strptime()と似た名前のメソッドに、strftime()があります。

私はこの2つをなかなか区別できなったのですが、pfの意味が分かったら簡単に覚えられました。

strptime()pparsepです。

「パース(parse)」は「解析する」という意味なので、strptime()は文字列を解析(parse)して、日時データに変換するメソッドと覚えましょう。

strftime()については、別の記事で解説していますので、末尾の「関連記事」をご参照ください。

3. まとめ

  • ISO 8601書式の文字列を日時データに変換には、fromisoformat()メソッドが使える
    • 対応クラス:datetime date time
  • 任意の書式の文字列を日時データに変換する場合は、datetimeクラスのstrptime()メソッドを使う

関連記事

isoformat()strftime()については、こちらの記事で解説しています。

python-onayami.com

参考情報