- 1 1. Pythonで日付と文字列を扱う前に知っておくべき基礎知識
- 2 2. 【文字列 → 日付】strptime()で日付オブジェクトを作成する方法
- 3 3. 【日付 → 文字列】strftime()で自由にフォーマット変換する方法
- 4 4. ISO 8601形式との相互変換テクニック
- 5 5. 日付を扱う上で知っておくと便利なテクニック集
- 6 6. よくある質問(FAQ)
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 |
%M | 分 | 30 |
%S | 秒 | 59 |
%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()
で処理できない余計な情報が含まれていないか
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 |
%M | 分 | 30 |
%S | 秒 | 00 |
%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:00
やZ
)が付く場合もある
この形式は、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:00
やZ
)を含む場合にうまく処理できないことがあります。そういったケースでは、サードパーティライブラリを使うとより柔軟に対応できます。
推奨ライブラリ: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
の利用が非常に有効です。
次章では、日付の計算や比較、差分の求め方など、実務で役立つ応用的なテクニックを紹介します。
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における日付と文字列の扱いにかなり自信がつくはずです。