本記事では、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, 2025
文字列型→日付型への変換
文字列型から日付型への変換には、主に以下の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
# Python 3.11以降ではより柔軟なISO形式の解析が可能
# タイムゾーン情報を含むISO形式の文字列も変換可能
if hasattr(datetime, 'fromisoformat') and datetime.fromisoformat.__code__.co_argcount > 1:
iso_with_tz = "2025-04-10T20:36:08+09:00"
dt_with_tz = datetime.fromisoformat(iso_with_tz)
print(f"タイムゾーン付きISO形式から変換: {dt_with_tz}")
# 出力例: タイムゾーン付きISO形式から変換: 2025-04-10 20:36:08+09:00
dateutil.parserを使用した柔軟な変換
標準ライブラリの機能だけでは対応できない複雑な形式や、形式が事前に分からない場合は、サードパーティライブラリのdateutil.parserが便利です。このライブラリの最大の利点は、日付形式を明示的に指定する必要がなく、様々な形式を自動的に認識して解析できることです。ユーザー入力やさまざまなソースからのデータを扱う場合、形式が統一されていないことが多いため、この柔軟性は非常に役立ちます。また、曖昧な日付形式(例:10/04/25が「10日4月2025年」なのか「10月4日2025年」なのか)の解釈も制御できます。
from dateutil import parser
# 様々な形式の文字列を自動的に解析
date_str1 = "2025-04-10"
date_str2 = "10/04/2025"
date_str3 = "10 Apr 2025"
date_str4 = "April 10, 2025"
date1 = parser.parse(date_str1)
date2 = parser.parse(date_str2)
date3 = parser.parse(date_str3)
date4 = parser.parse(date_str4)
print(f"解析結果1: {date1}")
print(f"解析結果2: {date2}")
print(f"解析結果3: {date3}")
print(f"解析結果4: {date4}")
# 出力例:
# 解析結果1: 2025-04-10 00:00:00
# 解析結果2: 2025-10-04 00:00:00 (注意: 日/月の順序が異なる場合がある)
# 解析結果3: 2025-04-10 00:00:00
# 解析結果4: 2025-04-10 00:00:00
# 曖昧な日付形式の場合は、dayfirst引数やyearfirst引数で解釈を指定できる
ambiguous_date = "10/04/25"
date_dmy = parser.parse(ambiguous_date, dayfirst=True) # 日/月/年として解釈
date_mdy = parser.parse(ambiguous_date, dayfirst=False) # 月/日/年として解釈
print(f"日/月/年として解釈: {date_dmy}")
print(f"月/日/年として解釈: {date_mdy}")
# 出力例:
# 日/月/年として解釈: 2025-04-10 00:00:00
# 月/日/年として解釈: 2025-10-04 00:00:00
例外処理
文字列から日付型への変換では、文字列が指定した形式と一致しない場合に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ではpytz
ライブラリや、Python 3.9以降では標準ライブラリのzoneinfo
を使用してタイムゾーンを扱うことができます。
from datetime import datetime
import pytz
# タイムゾーンを指定してdatetimeオブジェクトを作成
utc_now = datetime.now(pytz.UTC)
print(f"UTC時間: {utc_now}")
# 出力例: UTC時間: 2025-04-10 11:36:08+00:00
# 別のタイムゾーンに変換
jst = pytz.timezone('Asia/Tokyo')
jst_now = utc_now.astimezone(jst)
print(f"日本時間: {jst_now}")
# 出力例: 日本時間: 2025-04-10 20:36:08+09:00
# タイムゾーン情報を含む文字列に変換
tz_str = jst_now.strftime("%Y-%m-%d %H:%M:%S %z")
print(f"タイムゾーン情報を含む文字列: {tz_str}")
# 出力例: タイムゾーン情報を含む文字列: 2025-04-10 20:36:08 +0900
# Python 3.9以降ではzoneinfoが標準ライブラリに含まれる
try:
from zoneinfo import ZoneInfo
ny_time = datetime.now(ZoneInfo("America/New_York"))
print(f"ニューヨーク時間: {ny_time}")
# 出力例: ニューヨーク時間: 2025-04-10 07:36:08-04:00
except ImportError:
print("zoneinfoはPython 3.9以降で利用可能です")
日付の計算と操作
日付の計算や操作も日常的に必要となる処理です。
from datetime import datetime, timedelta
# 現在の日時
now = datetime.now()
print(f"現在: {now}")
# 出力例: 現在: 2025-04-10 20:36:08
# 日付の加算
tomorrow = now + timedelta(days=1)
print(f"明日: {tomorrow}")
# 出力例: 明日: 2025-04-11 20:36:08
# 日付の減算
yesterday = now - timedelta(days=1)
print(f"昨日: {yesterday}")
# 出力例: 昨日: 2025-04-09 20:36:08
# 時間の加算
three_hours_later = now + timedelta(hours=3)
print(f"3時間後: {three_hours_later}")
# 出力例: 3時間後: 2025-04-10 23:36:08
# 日付の差分を計算
future_date = datetime(2025, 12, 31)
days_remaining = (future_date - now).days
print(f"2025年末まであと{days_remaining}日")
# 出力例: 2025年末まであと265日
# 月末日の取得(カレンダーモジュールを使用)
import calendar
from datetime import date
year = 2025
month = 2
_, last_day = calendar.monthrange(year, month)
month_end = date(year, month, last_day)
print(f"2025年2月の月末: {month_end}")
# 出力例: 2025年2月の月末: 2025-02-28
まとめ
Pythonでの日付型と文字列型の変換方法について解説しました。
日付型から文字列型への変換は:
- strftimeメソッドを使用
- 様々な書式指定子を組み合わせて柔軟に形式を指定可能
文字列型から日付型への変換は:
- strptimeメソッドで書式を指定して変換
- fromisoformatメソッドでISO形式の文字列を簡単に変換(Python 3.7以降)
- dateutil.parserを使用して柔軟に様々な形式を解析
- 例外処理を適切に行うことが重要
また、実践的な日付処理として:
- タイムゾーンの扱い(pytzやzoneinfo)
- 日付の計算と操作(timedelta)
- 月末日の取得(calendar)
日付と時刻の扱いは多くの場面で必要となる基本的なスキルです。この記事で紹介した方法を活用して、効率的に日付データを処理してください。