【Python入門】日付と文字列を相互に変換する方法|strptime・strftimeの使い方を徹底解説

目次

1. Pythonで日付と文字列を扱う前に知っておくべき基礎知識

Pythonで日付や時間を処理する際、もっとも基本となるのが「datetimeモジュール」です。この記事では、日付と文字列を相互に変換する方法を詳しく解説しますが、その前に知っておくべき基本的な考え方やクラスについて、まずは整理しておきましょう。

Pythonの標準ライブラリdatetimeとは?

Pythonでは、日付や時間を扱うための標準ライブラリとしてdatetimeモジュールが用意されています。追加インストールの必要がなく、すぐに使えるのが特徴です。このモジュールを使うことで、現在時刻の取得、日付の加減算、フォーマット変換、比較など幅広い操作が可能です。

まずは、基本的なインポート方法を確認しましょう。

import datetime

または、以下のように必要なクラスだけをインポートすることもできます。

from datetime import datetime, date, time, timedelta

よく使われるクラスとその違い

datetimeモジュールには複数のクラスが存在しますが、日付と文字列の変換に関係が深いのは主に以下の3つです。

datetime.dateクラス

「年・月・日」の情報を表すクラスです。時間は含まれません。

d = datetime.date(2025, 4, 7)
print(d)  # 出力: 2025-04-07

datetime.timeクラス

「時・分・秒」など、時間に関する情報だけを持つクラスです。日付は含まれません。

t = datetime.time(14, 30, 0)
print(t)  # 出力: 14:30:00

datetime.datetimeクラス

日付(年・月・日)と時間(時・分・秒)の両方を扱える、最も汎用的なクラスです。

dt = datetime.datetime(2025, 4, 7, 14, 30)
print(dt)  # 出力: 2025-04-07 14:30:00

このクラスが、文字列と日付の相互変換で最も頻繁に利用されます。

datetime.now()で現在日時を取得する

datetime.datetimeクラスのnow()メソッドを使えば、現在の日時を簡単に取得できます。

from datetime import datetime

now = datetime.now()
print(now)  # 例: 2025-04-07 13:45:12.345678

このように取得したdatetimeオブジェクトは、あとで紹介するstrftime()strptime()を使って、文字列に変換したり、文字列から生成したりすることができます。

まとめ

このセクションでは、Pythonで日付と時間を扱う上で最も基本となるdatetimeモジュールの概要と、代表的なクラスの違いを解説しました。次のセクションでは、いよいよ「文字列から日付への変換」にフォーカスし、strptime()の具体的な使い方を紹介していきます。

2. 【文字列 → 日付】strptime()で日付オブジェクトを作成する方法

Pythonでは、日付を表す文字列をdatetimeオブジェクトに変換するために、strptime()というメソッドを使います。これは「string parse time」の略で、文字列を解析して日付として認識させる関数です。

この章では、基本的な使い方から、日本語表記に対応する方法、エラーの対処法までを順に解説します。

strptime()の基本的な使い方とフォーマット指定子一覧

基本構文

from datetime import datetime

date_string = '2025-04-07'
dt = datetime.strptime(date_string, '%Y-%m-%d')
print(dt)  # 出力: 2025-04-07 00:00:00

strptime()は、以下のような2つの引数を取ります:

  • 第1引数:解析対象の文字列(例: ‘2025-04-07’)
  • 第2引数:その文字列のフォーマット(例: ‘%Y-%m-%d’)

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

指定子意味
%Y西暦(4桁)2025
%y西暦(2桁)25
%m月(2桁)04
%d日(2桁)07
%H時(24時間)14
%M30
%S59
%A曜日(英語)Monday
%p午前/午後(AM/PM)AM

別の例:日時込みの変換

date_string = '2025-04-07 14:30:00'
dt = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
print(dt)  # 出力: 2025-04-07 14:30:00

日本語表記の日付文字列を扱うには?

日本語でよくある「2025年4月7日」や「2025年04月07日(月)」といったフォーマットを扱うには、以下のようにフォーマットを工夫します。

年月日の日本語付き文字列をパースする例

date_string = '2025年4月7日'
dt = datetime.strptime(date_string, '%Y年%m月%d日')
print(dt)  # 出力: 2025-04-07 00:00:00

日本語の曜日を含む文字列は基本のstrptime()では対応できない

例えば「2025年4月7日(月)」のような文字列は、strptime()単体ではエラーになります。なぜなら、Pythonのstrptime()はロケールに依存し、日本語の曜日には標準で非対応だからです。

この場合は以下のような対応策があります:

  • 文字列から不要な日本語の曜日部分を取り除いてからstrptime()に渡す
  • 外部ライブラリ(例:kanji_to_timeなど)を活用する

よくあるエラーとその対処法:ValueError

strptime()を使っていて最もよく遭遇するのが、以下のようなエラーです。

ValueError: time data '2025/04/07' does not match format '%Y-%m-%d'

このエラーの原因は?

これは、文字列の実際の形式と指定したフォーマットが一致していないために発生します。

例えば '2025/04/07' という日付を処理したい場合は、次のようにフォーマットもスラッシュに合わせる必要があります。

date_string = '2025/04/07'
dt = datetime.strptime(date_string, '%Y/%m/%d')

トラブルシューティングのポイント

  • 区切り文字(-、/、空白など)を確認
  • ゼロ埋めされているかどうか(例: ’04’ vs ‘4’)
  • 曜日など、strptime()で処理できない余計な情報が含まれていないか
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. 【日付 → 文字列】strftime()で自由にフォーマット変換する方法

Pythonで日付を扱う際、datetimeオブジェクトを特定のフォーマットで文字列に変換したい場面は非常に多くあります。そのような場合に便利なのが、strftime()メソッドです。

この章では、strftime()の基本的な使い方とよく使うフォーマット指定子、日本語の曜日や月名を表示する方法を解説します。

strftime()の基本的な使い方

構文と簡単な使用例

from datetime import datetime

dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
print(formatted)  # 出力: 2025-04-07 14:30:00

strftime()は「string format time」の略で、datetimeオブジェクトを指定したフォーマットの文字列に変換します。

よく使うフォーマット指定子(再掲)

指定子意味
%Y西暦(4桁)2025
%m月(2桁)04
%d日(2桁)07
%H時(24時間)14
%M30
%S00
%A曜日(英語)Monday
%a曜日(省略形)Mon
%p午前/午後(AM/PM)PM

実用例:フォーマットを自由にカスタマイズする

年月日をスラッシュ区切りで表示

dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y/%m/%d')
print(formatted)  # 出力: 2025/04/07

日本風フォーマットに変換

dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y年%m月%d日')
print(formatted)  # 出力: 2025年04月07日

時間付きで詳細表示

dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y年%m月%d日 %H時%M分')
print(formatted)  # 出力: 2025年04月07日 14時30分

日本語の曜日を表示したい場合

strftime('%A')を使えば曜日を表示できますが、デフォルトでは英語表記です。日本語で表示したい場合は、ロケール(言語設定)を変更する必要があります。

localeモジュールを使った例(UNIX/Linux環境向け)

import locale
from datetime import datetime

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y年%m月%d日(%A)')
print(formatted)  # 出力: 2025年04月07日(月曜日)

注意点

  • Windows環境では 'ja_JP.UTF-8' が使えない場合があります。
  • 環境依存のため、Webアプリや配布コードではハードコーディングは避けましょう。
  • 安定性を重視するなら、曜日を自分で辞書でマッピングする方法もあります。
weekdays = ['月', '火', '水', '木', '金', '土', '日']
weekday = weekdays[dt.weekday()]
print(f"{dt.strftime('%Y年%m月%d日')}({weekday})")

まとめ

この章では、datetimeオブジェクトを文字列に変換する方法として、strftime()の使い方と実例を紹介しました。出力形式を自由にカスタマイズできる点は、日付データの可視化やログ出力など、さまざまな場面で非常に役立ちます。

次章では、標準化された日付フォーマット「ISO 8601形式」との相互変換について解説していきます。

4. ISO 8601形式との相互変換テクニック

システム間のデータ連携やAPI通信などでは、日時を「ISO 8601形式」でやり取りすることが一般的です。Pythonでもこの形式との変換は非常に重要な操作のひとつです。

この章では、PythonでのISO 8601形式との相互変換方法と、タイムゾーン付きの文字列を扱う方法について解説します。

ISO 8601形式とは?

ISO 8601形式は、「国際標準化機構(ISO)」が定めた日付と時間の表記ルールです。以下のような形式で表されます:

2025-04-07T14:30:00
  • 日付と時間の間に “T” を挟む
  • 24時間表記
  • タイムゾーン情報(例: +09:00Z)が付く場合もある

この形式は、JSONやXMLなどのデータ形式、REST API、ログファイルなど、幅広く使用されます。

isoformat()で日付 → ISO形式の文字列に変換

Pythonのdatetimeオブジェクトには、isoformat()という便利なメソッドが用意されています。

使用例

from datetime import datetime

dt = datetime(2025, 4, 7, 14, 30)
iso_str = dt.isoformat()
print(iso_str)  # 出力: 2025-04-07T14:30:00

引数で微調整も可能

# ミリ秒まで表示
print(dt.isoformat(timespec='milliseconds'))  # 2025-04-07T14:30:00.000

# 日付だけ取得
print(dt.date().isoformat())  # 2025-04-07

fromisoformat()でISO形式 → datetimeオブジェクトへ変換

逆に、ISO 8601形式の文字列からdatetimeオブジェクトを生成するには、fromisoformat()を使用します。

使用例

iso_str = '2025-04-07T14:30:00'
dt = datetime.fromisoformat(iso_str)
print(dt)  # 出力: 2025-04-07 14:30:00

非常に直感的で、Python 3.7以降でサポートされています。

タイムゾーン情報を含むISO文字列に対応する方法

標準のfromisoformat()は、タイムゾーン情報(例:+09:00Z)を含む場合にうまく処理できないことがあります。そういったケースでは、サードパーティライブラリを使うとより柔軟に対応できます。

推奨ライブラリ:dateutil.parser

pip install python-dateutil

使用例

from dateutil import parser

iso_str = '2025-04-07T14:30:00+09:00'
dt = parser.parse(iso_str)
print(dt)  # 出力: 2025-04-07 14:30:00+09:00

このように、タイムゾーン付きのISO文字列も正確にパースできます。

補足:UTCとZ表記の違い

  • Zは「Zulu Time(UTC)」を意味する略記です。
  • 2025-04-07T14:30:00Z は、UTC(協定世界時)での時間を表します。

Pythonの標準fromisoformat()ではZ表記に未対応のため、やはりdateutil.parserの使用が推奨されます。

まとめ

ISO 8601形式は、日付と時間のデータ交換において欠かせない存在です。Pythonではisoformat()fromisoformat()を使って簡単に変換が可能ですが、タイムゾーン付きの文字列を扱う場合には、外部ライブラリdateutilの利用が非常に有効です。

次章では、日付の計算や比較、差分の求め方など、実務で役立つ応用的なテクニックを紹介します。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. 日付を扱う上で知っておくと便利なテクニック集

日付や時刻を扱う上で、単にフォーマットを変換するだけでなく、日付同士の比較日付の加算・減算などの処理もよく使われます。

この章では、datetimeモジュールの中でも実務で役立つテクニックを中心に解説します。

timedeltaを使って日付を加算・減算する

日付の「1日後」「1週間前」「30日後」などを計算したい場合には、datetime.timedeltaクラスを使います。

1日後・1日前を求める

from datetime import datetime, timedelta

today = datetime(2025, 4, 7)
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)

print(tomorrow)   # 出力: 2025-04-08 00:00:00
print(yesterday)  # 出力: 2025-04-06 00:00:00

時間単位での加減算も可能

dt = datetime(2025, 4, 7, 14, 30)
plus_2_hours = dt + timedelta(hours=2)

print(plus_2_hours)  # 出力: 2025-04-07 16:30:00

今日・昨日・明日の日付を取得する

現在日時をベースに、相対的な日付を取得するパターンも非常に一般的です。

from datetime import datetime, timedelta

now = datetime.now()
today = now.date()
yesterday = today - timedelta(days=1)
tomorrow = today + timedelta(days=1)

print(f"今日: {today}")
print(f"昨日: {yesterday}")
print(f"明日: {tomorrow}")

これにより、日報やスケジューラーのような機能も簡単に実装できます。

日付の比較と差分(日数)の計算

2つの日付の前後関係や、差分(日数・時間など)を計算することも可能です。

日付の比較(大小関係)

d1 = datetime(2025, 4, 7)
d2 = datetime(2025, 4, 10)

print(d1 < d2)  # 出力: True

差分を求める(timedeltaの活用)

delta = d2 - d1
print(delta.days)  # 出力: 3

このように、差分はtimedeltaオブジェクトとして得られ、その中の.days.seconds属性で細かく取得できます。

特定の曜日を取得・判定する方法

日付から曜日を取得したり、特定の曜日かどうかを判定したりするには、.weekday().isoweekday()を使います。

メソッド出力(例:月曜日)
.weekday()0(=月曜日)
.isoweekday()1(=月曜日)
d = datetime(2025, 4, 7)  # 月曜日

print(d.weekday())     # 出力: 0
print(d.isoweekday())  # 出力: 1

曜日を日本語で表示する方法(辞書によるマッピング)

weekdays = ['月', '火', '水', '木', '金', '土', '日']
weekday_jp = weekdays[d.weekday()]
print(f"{d.strftime('%Y/%m/%d')}({weekday_jp})")

うるう年の判定・月末の自動計算(補足)

import calendar

# うるう年かどうか判定
print(calendar.isleap(2024))  # 出力: True

# 月末の日付を取得
last_day = calendar.monthrange(2025, 4)[1]
print(last_day)  # 出力: 30

まとめ

この章では、実務で頻出する日付の加減算、比較、差分の計算方法、曜日の判定などを紹介しました。特にtimedeltaを活用した処理は非常に汎用性が高く、日付処理の基礎スキルとして覚えておきたいところです。

次の章では、これまで解説してきた内容に関連するよくある質問(FAQ)をまとめて、疑問の解消に役立つ情報を提供します。

6. よくある質問(FAQ)

Pythonで日付と文字列を扱う際、特に初心者の方がつまずきやすいポイントについて、よくある質問形式でまとめました。トラブル解決や理解の補強にご活用ください。

Q1. strptime()ValueError が出るのはなぜ?

A. フォーマットが合っていない可能性が高いです。

strptime()では、文字列と指定フォーマットが1文字でも違っているとエラーになります。

例:NGなケース

from datetime import datetime

date_string = '2025/04/07'
# フォーマットが「-」になっていて不一致
dt = datetime.strptime(date_string, '%Y-%m-%d')
# → ValueError発生

修正例:

dt = datetime.strptime(date_string, '%Y/%m/%d')

他にも、以下のような原因が考えられます:

  • ゼロ埋めの有無(04と4など)
  • 余計な文字(例:曜日やスペース)
  • 対応していない形式(日本語の「午前・午後」など)

Q2. 日本語の曜日が表示されず、英語になるのはなぜ?

A. strftime('%A')は、ロケール(言語設定)に依存しています。

Pythonの標準設定では英語が使われるため、%Aで取得される曜日は Monday などになります。

解決策1:localeモジュールを使う(UNIX/Linux系)

import locale
from datetime import datetime

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
dt = datetime(2025, 4, 7)
print(dt.strftime('%A'))  # 出力: 月曜日

解決策2:曜日を辞書で日本語にマッピング(環境依存しない)

weekdays = ['月', '火', '水', '木', '金', '土', '日']
print(weekdays[dt.weekday()])  # 出力: 月

Q3. 「午前」「午後」を含む日本語の日付を変換できますか?

A. Pythonの標準の strptime() では未対応です。

たとえば '2025年4月7日 午後2時30分' のような文字列は、標準のstrptime()ではエラーになります。

対応方法:

  • 自前で正規表現などを使って「午前/午後」を時刻に変換
  • 外部ライブラリ(例:dateparser)の利用
pip install dateparser
import dateparser

s = '2025年4月7日 午後2時30分'
dt = dateparser.parse(s)
print(dt)  # 出力: 2025-04-07 14:30:00

Q4. datetime.now()datetime.today() の違いは?

A. 実質的に同じです(datetime.datetimeでは)。

from datetime import datetime

print(datetime.now())     # 現在の日時を取得
print(datetime.today())   # 同様に現在の日時を取得

どちらも現在のローカル時刻を返します。厳密な違いはPythonドキュメント上にはありますが、通常の用途では同じ挙動と考えて問題ありません。

Q5. タイムゾーン付きのISO文字列が変換できません。どうすればいい?

A. datetime.fromisoformat()は一部のタイムゾーン付き文字列に非対応です。

例:2025-04-07T14:30:00+09:00 など

解決策:dateutil.parser.parse()を使う

from dateutil import parser

s = '2025-04-07T14:30:00+09:00'
dt = parser.parse(s)
print(dt)  # 出力: 2025-04-07 14:30:00+09:00

dateutilライブラリを使えば、タイムゾーン付き文字列にも柔軟に対応できます。

補足:Windowsで日本語ロケールがうまく動かない場合は?

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8') が通らない場合、Windowsのロケール名は Japanese_Japan.932 のようになります。

locale.setlocale(locale.LC_TIME, 'Japanese_Japan.932')

ただし、環境により差異があるため、辞書マッピングのほうが確実です。

まとめ

FAQでは、よくあるエラーや混乱しやすいポイントについて、具体例とともに解説しました。これらの疑問を解消できれば、Pythonにおける日付と文字列の扱いにかなり自信がつくはずです。