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つをなかなか区別できなったのですが、p
とf
の意味が分かったら簡単に覚えられました。
strptime()
のp
はparseのp
です。
「パース(parse)」は「解析する」という意味なので、strptime()
は文字列を解析(parse)して、日時データに変換するメソッドと覚えましょう。
strftime()
については、別の記事で解説していますので、末尾の「関連記事」をご参照ください。
3. まとめ
- ISO 8601書式の文字列を日時データに変換には、
fromisoformat()
メソッドが使える- 対応クラス:
datetime
date
time
- 対応クラス:
- 任意の書式の文字列を日時データに変換する場合は、
datetime
クラスのstrptime()
メソッドを使う
関連記事
isoformat()
やstrftime()
については、こちらの記事で解説しています。