本記事では、Pythonで日付と文字列の変換方法を解説します。日付データの扱いはWebアプリケーション開発やデータ分析など様々な場面で必要となるスキルです。この記事を読むことで、日付と文字列の相互変換を簡単に行えるようになります。
日付型・文字列型
まずはそれぞれの型について説明します。
日付型
Pythonでは主に2つの日付型があります。datetimeモジュールに含まれるdatetimeクラスとdateクラスです。
datetimeクラスは日付と時刻の両方を扱うことができます。年、月、日に加えて時、分、秒、マイクロ秒まで保持できるため、より詳細な時間情報が必要な場合に使用します。
以下はdatetimeクラスの基本的な使い方です。
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
print(now)
# 出力例: 2025-04-10 20:36:08.123456
# 特定の日時を作成
specific_datetime = datetime(2025, 4, 10, 20, 36, 0)
print(specific_datetime)
# 出力例: 2025-04-10 20:36:00
一方、dateクラスは日付のみを扱います。年、月、日の情報だけを保持し、時刻の情報は含みません。日付だけを扱う場合はこちらを使用すると良いでしょう。
from datetime import date
# 今日の日付を取得
today = date.today()
print(today)
# 出力例: 2025-04-10
# 特定の日付を作成
specific_date = date(2025, 4, 10)
print(specific_date)
# 出力例: 2025-04-10
使い分けとしては、以下のような基準があります。
- 時刻も含めた詳細な日時情報が必要な場合 → datetimeクラス
- 日付のみの情報で十分な場合 → dateクラス
- タイムスタンプや経過時間の計算が必要な場合 → datetimeクラス
- カレンダーや日付のみの表示が目的の場合 → dateクラス
文字列型
文字列型(str)は、テキストデータを表現するためのPythonの基本的なデータ型です。日付情報を人間が読みやすい形式で表示したり、ファイルに保存したりする際には、日付型を文字列型に変換する必要があります。
また、Webフォームやテキストファイルから読み込んだ日付データは文字列として扱われるため、これを日付型に変換して計算や比較を行うことが一般的です。
文字列で表現された日付には様々な形式があります。
# 日付を表す文字列の例
date_str1 = "2025-04-10" # ISO形式(YYYY-MM-DD)
date_str2 = "2025/04/10" # スラッシュ区切り
date_str3 = "10-Apr-2025" # 月名を含む形式
date_str4 = "20250410" # 区切り文字なし
date_str5 = "2025年04月10日" # 日本語表記
# 日時を表す文字列の例
datetime_str1 = "2025-04-10 20:36:08" # ISO形式に近い
datetime_str2 = "2025/04/10 20:36:08" # スラッシュ区切り
datetime_str3 = "10-Apr-2025 20:36:08" # 月名を含む形式
datetime_str4 = "20250410203608" # 区切り文字なし
日付型→文字列型への変換
日付型から文字列型への変換は、strftimeメソッドを使用します。このメソッドを使うと、日付を任意の形式の文字列に変換できます。
以下は、datetimeオブジェクトを様々な形式の文字列に変換する例です。
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
print(f"元のdatetimeオブジェクト: {now}")
# ISO形式(YYYY-MM-DD)に変換
iso_format = now.strftime("%Y-%m-%d")
print(f"ISO形式: {iso_format}")
# 出力例: ISO形式: 2025-04-10
# 日本語の年月日形式に変換
jp_format = now.strftime("%Y年%m月%d日")
print(f"日本語形式: {jp_format}")
# 出力例: 日本語形式: 2025年04月10日
# 月名を含む形式に変換
month_name_format = now.strftime("%d-%b-%Y")
print(f"月名を含む形式: {month_name_format}")
# 出力例: 月名を含む形式: 10-Apr-2025
# 日時を含む詳細な形式に変換
detailed_format = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"詳細形式: {detailed_format}")
# 出力例: 詳細形式: 2025-04-10 20:36:08
# 曜日を含む形式に変換
weekday_format = now.strftime("%Y-%m-%d (%a)")
print(f"曜日を含む形式: {weekday_format}")
# 出力例: 曜日を含む形式: 2025-04-10 (Thu)
strftimeメソッドで使用できる主な書式指定子は以下の通りです。
書式指定子 | 説明 | 例 |
---|---|---|
%Y | 4桁の年 | 2025 |
%y | 2桁の年 | 25 |
%m | 2桁の月 | 01〜12 |
%d | 2桁の日 | 01〜31 |
%H | 24時間表記の時 | 00〜23 |
%I | 12時間表記の時 | 01〜12 |
%M | 分 | 00〜59 |
%S | 秒 | 00〜59 |
%a | 曜日の省略名 | Sun, Mon, … |
%A | 曜日の完全名 | Sunday, Monday, … |
%b | 月の省略名 | Jan, Feb, … |
%B | 月の完全名 | January, February, … |
%p | AM/PM | AM, PM |
dateオブジェクトでも同様にstrftimeメソッドが使えます。ただし、時刻に関する書式指定子(%H, %M, %Sなど)は使用できません。
from datetime import date
# 今日の日付を取得
today = date.today()
# 様々な形式に変換
format1 = today.strftime("%Y/%m/%d")
format2 = today.strftime("%d-%m-%Y")
format3 = today.strftime("%B %d, %Y")
print(f"形式1: {format1}")
print(f"形式2: {format2}")
print(f"形式3: {format3}")
# 出力例:
# 形式1: 2025/04/10
# 形式2: 10-04-2025
# 形式3: April 10, 2025025
文字列型→日付型への変換
文字列型から日付型への変換には、主に以下の2つの方法があります。
- datetime.strptime()メソッド
- datetime.fromisoformat()メソッド(Python 3.7以降)
strptimeメソッドを使用した変換
strptimeメソッドは、文字列と書式を指定して日付型に変換します。文字列の形式が事前に分かっている場合に使用します。
from datetime import datetime
# ISO形式(YYYY-MM-DD)の文字列を日付型に変換
date_str1 = "2025-04-10"
date1 = datetime.strptime(date_str1, "%Y-%m-%d")
print(f"変換結果1: {date1}")
# 出力例: 変換結果1: 2025-04-10 00:00:00
# 日本語形式の文字列を日付型に変換
date_str2 = "2025年04月10日"
date2 = datetime.strptime(date_str2, "%Y年%m月%d日")
print(f"変換結果2: {date2}")
# 出力例: 変換結果2: 2025-04-10 00:00:00
# 時刻を含む文字列を日付型に変換
datetime_str = "2025-04-10 20:36:08"
dt = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S")
print(f"変換結果3: {dt}")
# 出力例: 変換結果3: 2025-04-10 20:36:08
# dateオブジェクトが必要な場合は.dateメソッドを使用
date_only = dt.date()
print(f"日付のみ: {date_only}")
# 出力例: 日付のみ: 2025-04-10
fromisoformatメソッドを使用した変換
Python 3.7以降では、ISO形式(YYYY-MM-DD)の文字列を簡単に変換できるfromisoformatメソッドが追加されました。
from datetime import date, datetime
# ISO形式の日付文字列を変換
iso_date_str = "2025-04-10"
date_obj = date.fromisoformat(iso_date_str)
print(f"ISO形式から変換: {date_obj}")
# 出力例: ISO形式から変換: 2025-04-10
# ISO形式の日時文字列を変換
iso_datetime_str = "2025-04-10T20:36:08"
dt = datetime.fromisoformat(iso_datetime_str)
print(f"ISO日時形式から変換: {dt}")
# 出力例: ISO日時形式から変換: 2025-04-10 20:36:08:36:08
例外処理
文字列から日付型への変換では、文字列が指定した形式と一致しない場合にValueErrorが発生します。実際のアプリケーションでは、適切に例外処理を行うことが重要です。
from datetime import datetime
def parse_date(date_string, format_string):
try:
return datetime.strptime(date_string, format_string)
except ValueError as e:
print(f"エラー: {date_string} は {format_string} 形式ではありません")
print(f"詳細: {e}")
return None
# 正しい形式
result1 = parse_date("2025-04-10", "%Y-%m-%d")
print(f"結果1: {result1}")
# 出力例: 結果1: 2025-04-10 00:00:00
# 誤った形式
result2 = parse_date("2025/04/10", "%Y-%m-%d")
print(f"結果2: {result2}")
# 出力例:
# エラー: 2025/04/10 は %Y-%m-%d 形式ではありません
# 詳細: time data '2025/04/10' does not match format '%Y-%m-%d'
# 結果2: None
まとめ
Pythonでの日付型と文字列型の変換方法について解説しました。
日付型から文字列型への変換は:
- strftimeメソッドを使用
- 様々な書式指定子を組み合わせて柔軟に形式を指定可能
文字列型から日付型への変換は:
- strptimeメソッドで書式を指定して変換
- fromisoformatメソッドでISO形式の文字列を簡単に変換(Python 3.7以降)
- 例外処理を適切に行うことが重要
日付と時刻の扱いは多くのプログラミングで必要となる基本的なスキルです。この記事で紹介した方法を活用して、効率的に日付データを処理してください。