フリーキーズ | 独学プログラミング

Pythonのdatetimeモジュールを解説!日付・時刻処理の基本から応用まで

リンドくん

リンドくん

先生、Pythonで日付や時刻を扱いたいんですけど、どうやって今日の日付を取得したり、計算したりするんですか?

たなべ

たなべ

Pythonにはdatetimeモジュールという強力なツールがあるんだ。
これを使えば、日付の取得から計算、フォーマット変換まで、時間に関するあらゆる処理ができるようになるよ。

プログラミングを学んでいると、必ずといっていいほど日付や時刻を扱う場面に遭遇します。
ログの記録、予約システム、データ分析など、様々な場面で日時の処理が必要になるのではないでしょうか。

Pythonのdatetimeモジュールは、こうした日時処理を簡単かつ効率的に行うための機能を提供してくれます。
この記事では、Pythonのdatetimeモジュールを基礎から応用まで、初心者でも理解できるよう段階的に解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

datetimeモジュールとは?基本概念を理解しよう

リンドくん

リンドくん

そもそもdatetimeモジュールって何なんですか?

たなべ

たなべ

datetimeモジュールは、Pythonの標準ライブラリの一つで、日付や時刻を扱うための専用ツールなんだ。
インストール不要で使えるから、すぐに始められるよ!

datetimeモジュールの役割

datetimeモジュールは、日付と時刻に関する様々な操作を行うためのPython標準ライブラリです。
このモジュールを使うことで、以下のような処理が簡単に実現できます。

  • 現在の日時の取得 - 今の日付や時刻を瞬時に取得
  • 日時の計算 - 日付の足し算引き算、期間の計算
  • フォーマット変換 - 「2025-01-15」を「2025年1月15日」に変換
  • 文字列との相互変換 - テキストデータと日時オブジェクトの変換

主要なクラスの紹介

datetimeモジュールには、用途に応じて使い分ける主要なクラスがあります。

  • datetime - 日付と時刻の両方を扱う
  • date - 日付のみを扱う
  • time - 時刻のみを扱う
  • timedelta - 時間の差や期間を表現する

これらの中でも、特にdatetimeクラスは最も汎用性が高く、日常的な開発でよく使われます。
まずはこのクラスから始めることをおすすめします。

基本的なインポート方法

datetimeモジュールを使用するには、まずインポートが必要です。以下のような書き方ができます。

# 方法1: モジュール全体をインポート
import datetime

# 方法2: 特定のクラスのみインポート
from datetime import datetime, date, time

# 方法3: よく使うものだけインポート
from datetime import datetime

自分は方法2をおすすめします。
必要なクラスだけをインポートすることで、コードがスッキリして読みやすくなるからです。

現在の日時を取得する方法

リンドくん

リンドくん

まずは今の日付と時刻を取得してみたいです!

たなべ

たなべ

それならdatetime.now()メソッドが一番簡単だね。
実際にコードを見てみよう!

基本的な日時取得

現在の日時を取得する最も基本的な方法は、datetime.now()メソッドを使用することです。

from datetime import datetime

# 現在の日時を取得
now = datetime.now()
print(now)
# 出力例: 2025-01-15 14:30:25.123456

このように、datetime.now()を実行するだけで、現在の年月日と時分秒まで取得できます。

日付のみ、時刻のみを取得

全体の日時情報から、必要な部分だけを抜き出すことも可能です。

from datetime import datetime

now = datetime.now()

# 日付のみ取得
today = now.date()
print(f"今日の日付: {today}")
# 出力例: 今日の日付: 2025-01-15

# 時刻のみ取得
current_time = now.time()
print(f"現在の時刻: {current_time}")
# 出力例: 現在の時刻: 14:30:25.123456

# 個別の要素を取得
print(f"年: {now.year}")
print(f"月: {now.month}")
print(f"日: {now.day}")
print(f"時: {now.hour}")
print(f"分: {now.minute}")
print(f"秒: {now.second}")

UTC時刻の取得

世界標準時(UTC)で時刻を取得したい場合は、datetime.utcnow()を使用します。

from datetime import datetime

# 現地時間
local_time = datetime.now()
print(f"現地時間: {local_time}")

# UTC時間
utc_time = datetime.utcnow()
print(f"UTC時間: {utc_time}")

これらの基本的な取得方法を覚えておけば、ほとんどの日時取得処理に対応できるでしょう。

日時の計算とtimedelta

リンドくん

リンドくん

日付の計算ってどうやるんですか?例えば、今日から3日後の日付を知りたい場合は?

たなべ

たなべ

それにはtimedeltaクラスを使うんだ!
これを使えば、日付の足し算引き算が簡単にできるよ。

timedeltaクラスの基本

timedelta(タイムデルタ)は、時間の差や期間を表現するためのクラスです。これを使うことで、日時の計算が直感的に行えます。

from datetime import datetime, timedelta

# 現在の日時
now = datetime.now()
print(f"現在: {now}")

# 3日後
three_days_later = now + timedelta(days=3)
print(f"3日後: {three_days_later}")

# 1週間前
one_week_ago = now - timedelta(weeks=1)
print(f"1週間前: {one_week_ago}")

# 5時間30分後
five_hours_thirty_minutes = now + timedelta(hours=5, minutes=30)
print(f"5時間30分後: {five_hours_thirty_minutes}")

よく使う計算パターン

実際の開発でよく使われる日時計算のパターンをご紹介します。

from datetime import datetime, timedelta

now = datetime.now()

# 明日の同じ時刻
tomorrow = now + timedelta(days=1)

# 来月の同じ日(概算)
next_month = now + timedelta(days=30)

# 1時間前
one_hour_ago = now - timedelta(hours=1)

# 営業日の計算(土日を除く5日後)
business_days = 0
target_date = now
while business_days < 5:
    target_date += timedelta(days=1)
    # 平日のみカウント(0=月曜日、6=日曜日)
    if target_date.weekday() < 5:
        business_days += 1

print(f"営業日5日後: {target_date}")

期間の計算

2つの日時の差を計算することも簡単にできます。

from datetime import datetime

# 開始日時と終了日時を設定
start_date = datetime(2025, 1, 1, 9, 0, 0)
end_date = datetime(2025, 1, 15, 17, 30, 0)

# 期間の計算
duration = end_date - start_date
print(f"期間: {duration}")
print(f"日数: {duration.days}日")
print(f"秒数: {duration.seconds}秒")
print(f"総秒数: {duration.total_seconds()}秒")

このように、timedeltaを使うことで複雑な日時計算も直感的に書けるようになります。

文字列フォーマットと相互変換

リンドくん

リンドくん

データベースから取得した文字列の日付を、Pythonで扱える形に変換するにはどうすればいいですか?

たなべ

たなべ

それにはstrptime()とstrftime()メソッドを使うんだ。
この2つを覚えておけば、文字列と日時オブジェクトの相互変換が自由自在になるよ!

日時オブジェクトを文字列に変換(strftime)

strftime()メソッドを使うことで、datetimeオブジェクトを任意の文字列形式に変換できます。

from datetime import datetime

now = datetime.now()

# 基本的なフォーマット
print(now.strftime("%Y-%m-%d"))           # 2025-01-15
print(now.strftime("%Y年%m月%d日"))        # 2025年01月15日
print(now.strftime("%H:%M:%S"))           # 14:30:25
print(now.strftime("%Y-%m-%d %H:%M:%S"))  # 2025-01-15 14:30:25

# 実用的なフォーマット例
print(now.strftime("%Y/%m/%d (%a)"))      # 2025/01/15 (Wed)
print(now.strftime("%m月%d日 %H時%M分"))   # 01月15日 14時30分
print(now.strftime("%B %d, %Y"))          # January 15, 2025

文字列を日時オブジェクトに変換(strptime)

逆に、文字列からdatetimeオブジェクトを作成するにはstrptime()を使用します。

from datetime import datetime

# 様々な文字列形式から日時オブジェクトを作成
date_str1 = "2025-01-15"
date_obj1 = datetime.strptime(date_str1, "%Y-%m-%d")
print(date_obj1)

date_str2 = "2025/01/15 14:30:25"
date_obj2 = datetime.strptime(date_str2, "%Y/%m/%d %H:%M:%S")
print(date_obj2)

date_str3 = "15-Jan-2025"
date_obj3 = datetime.strptime(date_str3, "%d-%b-%Y")
print(date_obj3)

よく使うフォーマット指定子

日時フォーマットでよく使われる指定子を覚えておくと便利です。

# 年月日
%Y  # 4桁の年(2025)
%y  # 2桁の年(25)
%m  # 月(01-12)
%B  # 月名(January)
%b  # 月名短縮(Jan)
%d  # 日(01-31)

# 時分秒
%H  # 時(00-23)
%I  # 時(01-12)
%M  # 分(00-59)
%S  # 秒(00-59)

# 曜日
%A  # 曜日名(Wednesday)
%a  # 曜日名短縮(Wed)
%w  # 曜日番号(0=日曜日)

実用的な変換例

実際の開発でよくある変換パターンをご紹介します。

from datetime import datetime

# CSVファイルから読み込んだ日付文字列を処理
csv_date = "2025-01-15T14:30:25"
parsed_date = datetime.strptime(csv_date, "%Y-%m-%dT%H:%M:%S")

# ユーザーフレンドリーな表示形式に変換
friendly_format = parsed_date.strftime("%Y年%m月%d日 %H時%M分")
print(f"表示用: {friendly_format}")

# データベース保存用の形式に変換
db_format = parsed_date.strftime("%Y-%m-%d %H:%M:%S")
print(f"DB保存用: {db_format}")

使用例とベストプラクティス

リンドくん

リンドくん

実際のプロジェクトでは、どんな場面でdatetimeを使うことが多いんですか?

たなべ

たなべ

いろんな場面があるよ!ログの記録、予約システム、データ分析など、本当によく使うんだ。
実際のコード例を見せながら説明するね。

ログ記録システム

アプリケーションのログ記録は、datetimeの最も一般的な使用例の一つです。

from datetime import datetime
import os

def write_log(message, log_level="INFO"):
    """ログファイルにメッセージを記録する関数"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_entry = f"[{timestamp}] {log_level}: {message}\n"
    
    # ログファイルに書き込み
    with open("app.log", "a", encoding="utf-8") as log_file:
        log_file.write(log_entry)
    
    print(f"ログ記録完了: {log_entry.strip()}")

# 使用例
write_log("アプリケーションが開始されました")
write_log("データベース接続に失敗しました", "ERROR")
write_log("ユーザーがログインしました")

予約システムの時間管理

予約システムでは、営業時間のチェックや予約可能時間の計算でdatetimeが活躍します。

from datetime import datetime, timedelta

class ReservationSystem:
    def __init__(self):
        self.business_hours = {
            'start': 9,  # 営業開始時間
            'end': 17,   # 営業終了時間
        }
    
    def is_business_time(self, check_datetime):
        """営業時間内かどうかをチェック"""
        hour = check_datetime.hour
        weekday = check_datetime.weekday()  # 0=月曜日, 6=日曜日
        
        # 土日は営業時間外
        if weekday >= 5:
            return False
        
        # 営業時間内かチェック
        return self.business_hours['start'] <= hour < self.business_hours['end']
    
    def get_next_available_time(self, preferred_time):
        """次の利用可能時間を取得"""
        current_time = preferred_time
        
        while not self.is_business_time(current_time):
            current_time += timedelta(hours=1)
            
            # 営業時間外の場合は翌営業日の開始時間に設定
            if current_time.hour >= self.business_hours['end']:
                next_day = current_time + timedelta(days=1)
                current_time = datetime(
                    next_day.year, next_day.month, next_day.day,
                    self.business_hours['start']
                )
        
        return current_time

# 使用例
reservation = ReservationSystem()

# 予約希望時間(土曜日の場合)
preferred = datetime(2025, 1, 18, 14, 0)  # 土曜日14時
available = reservation.get_next_available_time(preferred)
print(f"予約可能時間: {available.strftime('%Y年%m月%d日 %H時%M分')}")

データ分析での期間集計

データ分析では、特定の期間でのデータ集計が頻繁に行われます。

from datetime import datetime, timedelta
from collections import defaultdict

def analyze_sales_data(sales_data):
    """売上データを期間別に分析する"""
    # 期間別売上の辞書
    daily_sales = defaultdict(float)
    monthly_sales = defaultdict(float)
    
    for sale in sales_data:
        sale_date = datetime.strptime(sale['date'], "%Y-%m-%d")
        amount = sale['amount']
        
        # 日別集計
        day_key = sale_date.strftime("%Y-%m-%d")
        daily_sales[day_key] += amount
        
        # 月別集計
        month_key = sale_date.strftime("%Y-%m")
        monthly_sales[month_key] += amount
    
    return daily_sales, monthly_sales

# サンプルデータ
sales_data = [
    {'date': '2025-01-10', 'amount': 1000},
    {'date': '2025-01-11', 'amount': 1500},
    {'date': '2025-01-15', 'amount': 2000},
    {'date': '2025-02-01', 'amount': 1200},
]

daily, monthly = analyze_sales_data(sales_data)
print("日別売上:", dict(daily))
print("月別売上:", dict(monthly))

パフォーマンス測定

プログラムの実行時間を測定する際にもdatetimeが役立ちます。

from datetime import datetime
import time

def measure_performance(func):
    """関数の実行時間を測定するデコレータ"""
    def wrapper(*args, **kwargs):
        start_time = datetime.now()
        print(f"処理開始: {start_time.strftime('%H:%M:%S')}")
        
        result = func(*args, **kwargs)
        
        end_time = datetime.now()
        duration = end_time - start_time
        print(f"処理終了: {end_time.strftime('%H:%M:%S')}")
        print(f"実行時間: {duration.total_seconds():.2f}秒")
        
        return result
    return wrapper

@measure_performance
def heavy_calculation():
    """時間のかかる処理のサンプル"""
    time.sleep(2)  # 2秒の処理をシミュレート
    return "計算完了"

# 使用例
result = heavy_calculation()

これらの例からもわかるように、datetimeモジュールは様々な場面で重宝する強力なツールです。
基本をマスターすれば、あなたのプログラムに時間の概念を簡単に組み込むことができるでしょう。

まとめ

リンドくん

リンドくん

datetimeモジュールって思っていたより奥が深いんですね!

たなべ

たなべ

datetimeは一度覚えてしまえば、本当に色々な場面で活用できるからね。
ぜひ実際のプロジェクトでも使ってみてほしいな。

この記事では、Pythonのdatetimeモジュールについて、基本的な概念から実践的な使用例まで幅広く解説してきました。

重要なポイントをもう一度おさらいしてみましょう。

  • datetimeモジュールは日時処理のための標準ライブラリで、インストール不要ですぐに使える
  • datetime.now()で現在の日時を取得し、timedeltaで日時の計算が可能
  • strftime()とstrptime()を使えば、文字列と日時オブジェクトの相互変換が自在
  • ログ記録、予約システム、データ分析など、実際の開発で活用場面は非常に多い

日時処理は、Webアプリケーション開発、データ分析、自動化スクリプトなど、あらゆる分野で必要となるスキルです。
今回学んだ基本を土台に、ぜひ自分のプロジェクトでも積極的に活用してみてください。

この記事をシェア

関連するコンテンツ