Python datetime 完全ガイド|日付・時刻・タイムゾーンの使い方と実践例

目次

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 datetimetimeの違いは?

項目datetimetime
目的日付・時刻の処理UNIX時間の計測やスリープ処理
datetime(2025, 2, 1, 12, 0, 0)time.sleep(2)

9.2 strftimestrptime の違いは?

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での時間処理の実践をすすめよう

スケジュール管理アプリの開発
ログデータの解析
異なるタイムゾーンでの時刻計算
自動リマインダー機能の実装

最後までお読みいただき、ありがとうございました!

広告