1. はじめに
Pythonで日付や時刻を扱う際に欠かせないのが datetime
モジュールです。このモジュールを使うことで、現在の時刻の取得、日時のフォーマット変換、時間の計算など、さまざまな操作が可能になります。
しかし、Python初心者にとって datetime
の扱いは少し難しく感じることがあります。例えば:
- 「現在の日付や時刻を取得したいけど、どの関数を使えばいい?」
- 「タイムゾーンを考慮した時刻の処理が分からない!」
- 「日付を計算するにはどうすればいいの?」
本記事では、Pythonの datetime
モジュールの基本から応用まで、わかりやすく解説していきます。初心者の方でもスムーズに理解できるよう、コード例を交えて説明していきますので、ぜひ参考にしてください。
2. datetimeモジュールとは?基本概念を理解しよう
2.1 datetimeモジュールの概要
Pythonには標準ライブラリとして datetime
モジュールが用意されており、これを使うことで日付や時刻の操作が簡単にできます。datetime
モジュールには、以下のような主要なクラスが含まれています。
クラス名 | 概要 |
---|---|
datetime | 日付と時刻を扱うクラス |
date | 日付のみを扱うクラス |
time | 時刻のみを扱うクラス |
timedelta | 時間の差を表すクラス |
tzinfo | タイムゾーン情報を扱うためのクラス |
このうち、最もよく使われるのが datetime
クラスです。
2.2 datetimeモジュールのインポート方法
Pythonの datetime
モジュールを使うには、まずインポートする必要があります。以下のように import datetime
を使うことで、モジュール全体をインポートできます。
import datetime
# 現在の日時を取得
now = datetime.datetime.now()
print(now)
また、特定のクラスのみをインポートすることも可能です。
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
print(now)
from datetime import datetime
の形でインポートすると、コード内で datetime.datetime.now()
のように datetime
を二重に書かずに済むため、よりシンプルになります。
3. Pythonで現在時刻・今日の日付を取得する方法(nowとtodayの違い)
3.1 現在の日時を取得する方法
Pythonでは、現在の日時を取得するには datetime.now()
を使います。
from datetime import datetime
now = datetime.now()
print("現在の日時:", now)
このコードを実行すると、次のような出力が得られます。
現在の日時: 2025-02-01 12:34:56.789012
この形式は YYYY-MM-DD HH:MM:SS.ssssss
という形になっており、日付・時刻・マイクロ秒を含んでいます。
3.2 今日の日付を取得する方法
今日の日付のみを取得したい場合は、date.today()
を使用します。
from datetime import date
today = date.today()
print("今日の日付:", today)
出力例:
今日の日付: 2025-02-01
3.3 now()
と today()
の違い
メソッド | 機能 |
---|---|
datetime.now() | 現在の「日付と時刻」を取得 |
date.today() | 現在の「日付のみ」を取得 |
用途に応じて使い分けるとよいでしょう。
4. 日付と時刻のフォーマット変換(文字列⇔datetime)
日付や時刻を扱う際、フォーマットの変換は非常に重要です。Pythonでは strftime()
と strptime()
を使って、日時と文字列を相互変換できます。
4.1 datetimeオブジェクトを文字列に変換する(strftime
)
日時を特定のフォーマットの文字列に変換したい場合は、strftime()
を使います。
from datetime import datetime
now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print("フォーマット済み日付:", formatted_date)
出力:
フォーマット済み日付: 2025-02-01 12:34:56
4.2 文字列をdatetimeオブジェクトに変換する(strptime
)
文字列から datetime
に変換するには strptime()
を使います。
from datetime import datetime
date_str = "2025-02-01 12:34:56"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print("変換後のdatetimeオブジェクト:", dt)
出力:
変換後のdatetimeオブジェクト: 2025-02-01 12:34:56
5. Pythonで日付を足し算・引き算する方法(timedeltaの使い方)
Pythonでは timedelta
クラスを使用することで、日付や時刻の加算・減算が簡単にできます。
5.1 timedelta
クラスの基本
from datetime import datetime, timedelta
# 現在の日付・時刻を取得
now = datetime.now()
# 7日後の日付を取得
future_date = now + timedelta(days=7)
print("7日後の日付:", future_date)
# 3日前の日付を取得
past_date = now - timedelta(days=3)
print("3日前の日付:", past_date)
5.2 時間単位での加算・減算
from datetime import datetime, timedelta
now = datetime.now()
# 1時間後の時刻
one_hour_later = now + timedelta(hours=1)
print("1時間後の時刻:", one_hour_later)
# 30分前の時刻
thirty_minutes_ago = now - timedelta(minutes=30)
print("30分前の時刻:", thirty_minutes_ago)
5.3 2つの日付の差分を求める
from datetime import datetime
# 2つの日付を定義
date1 = datetime(2025, 2, 10)
date2 = datetime(2025, 2, 1)
# 差分を計算
difference = date1 - date2
print("日付の差:", difference)
print("日数差:", difference.days, "日")
6. タイムゾーンを考慮した日時の扱い方(pytzとzoneinfoの違い)
Pythonで日付や時刻を扱う際、タイムゾーンを考慮することは非常に重要です。
6.1 pytz
を使ったタイムゾーン設定
from datetime import datetime
import pytz
# タイムゾーンの指定
japan_tz = pytz.timezone('Asia/Tokyo')
# 現在のUTC時刻を取得
utc_now = datetime.utcnow()
# JST(日本標準時)に変換
jst_now = utc_now.replace(tzinfo=pytz.utc).astimezone(japan_tz)
print("日本時間(JST):", jst_now)
6.2 zoneinfo
(Python 3.9以降)を使ったタイムゾーン設定
from datetime import datetime
from zoneinfo import ZoneInfo
# JST(日本標準時)の現在時刻を取得
jst_now = datetime.now(ZoneInfo("Asia/Tokyo"))
print("JSTの現在時刻:", jst_now)
Python 3.9以降を使用している場合は、zoneinfo
を利用するのがおすすめです。
7. エラーとその対処法
Pythonの datetime
モジュールを使用する際、特に初心者が遭遇しやすいエラーがいくつかあります。
7.1 AttributeError: type object 'datetime.datetime' has no attribute 'timedelta'
from datetime import datetime
# timedelta を使おうとするがエラー
now = datetime.now()
new_date = now + datetime.timedelta(days=7)
解決策:
from datetime import datetime, timedelta
now = datetime.now()
new_date = now + timedelta(days=7)
print(new_date)
7.2 TypeError: can't subtract offset-naive and offset-aware datetimes
from datetime import datetime
import pytz
dt_naive = datetime(2025, 2, 1, 12, 0)
dt_aware = datetime(2025, 2, 1, 12, 0, tzinfo=pytz.utc)
diff = dt_aware - dt_naive # エラー発生
解決策:
dt_aware = dt_naive.replace(tzinfo=pytz.utc)
8. 実践例
8.1 日付範囲を生成する方法
from datetime import datetime, timedelta
start_date = datetime(2025, 2, 1)
end_date = datetime(2025, 2, 7)
date_list = [start_date + timedelta(days=i) for i in range((end_date - start_date).days + 1)]
for date in date_list:
print(date.strftime("%Y-%m-%d"))
8.2 営業日(平日)を考慮した日付計算
import pandas as pd
business_days = pd.bdate_range(start="2025-02-01", end="2025-02-10")
for day in business_days:
print(day.date())
8.3 UNIXタイムスタンプの変換
from datetime import datetime
timestamp = 1735689600
dt = datetime.fromtimestamp(timestamp)
print("変換後のdatetime:", dt)
9. FAQ(よくある質問)
9.1 datetime
とtime
の違いは?
項目 | datetime | time |
---|---|---|
目的 | 日付・時刻の処理 | UNIX時間の計測やスリープ処理 |
例 | datetime(2025, 2, 1, 12, 0, 0) | time.sleep(2) |
9.2 strftime
と strptime
の違いは?
from datetime import datetime
# datetime → 文字列(strftime)
now = datetime(2025, 2, 1, 12, 0, 0)
formatted_str = now.strftime("%Y-%m-%d %H:%M:%S")
print("文字列に変換:", formatted_str)
# 文字列 → datetime(strptime)
date_str = "2025-02-01 12:00:00"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print("datetimeに変換:", parsed_date)
9.3 UNIXタイムスタンプを datetime
に変換するには?
from datetime import datetime
timestamp = 1735689600
dt = datetime.fromtimestamp(timestamp)
print("変換後のdatetime:", dt)
10. まとめ
10.1 記事のポイントまとめ
datetime
モジュールは、Pythonで日付や時刻を扱うための標準ライブラリ。datetime.now()
で現在の日時を取得、date.today()
で現在の日付のみを取得。strftime()
でdatetime
→ 文字列へ変換、strptime()
で 文字列 →datetime
へ変換。timedelta(days=7)
で1週間後の日付を計算。- Python 3.9以降は
zoneinfo
、それ以前はpytz
を使用。 datetime
オブジェクト同士を>
<
==
で比較可能。
10.2 公式ドキュメントと参考資料
10.3 Pythonでの時間処理の実践をすすめよう
✅ スケジュール管理アプリの開発
✅ ログデータの解析
✅ 異なるタイムゾーンでの時刻計算
✅ 自動リマインダー機能の実装
最後までお読みいただき、ありがとうございました!