【Python】datetime型の扱い方|コードで徹底解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年7月)

✔当記事は以下のような方に向けて書かれています

「Pythonのdatetimeはどんな機能を持っているのだろう?」

「Pythonのdatetimeの使い方をマスターしたい」

「Pythonのdatetimeの実践的な例を知りたい」

✔当記事で解説する内容

  • Pythonのdatetimeの概要
  • Pythonのdatetimeの正確な操作法とその応用
  • Pythonのdatetimeを用いた具体的な例

当記事では、Pythonのdatetimeの基本機能から、その応用技術まで、具体的な例を交えて詳しく説明しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Pythonのdatetimeとは

こちらでは、Pythonのdatetimeについて、基本事項を確認していきます。

基本を抑えたうえで、先の使い方などへ進んでください。

  • Pythonのdatetimeモジュールとは?
  • datetimeの主要クラス
  • Aware(アウェア)とNaive(ナイーヴ)の違い

Pythonのdatetimeモジュールとは?

Pythonのdatetimeモジュールは、日付と時刻を操作するためのクラスを提供するもの。

非常に多くの用途があり、以下はその一部です。

  • データ分析
  • ログのタイムスタンプ
  • 誕生日や会議などのイベントをスケジュールする

とくにデータサイエンスの分野では、時間シリーズデータの分析に頻繁に利用されます。

datetimeの主要クラス

Datetimeモジュールは、主に次の4つのクラスを提供しています。

これらはすべて、日付や時刻を表現するために使われるものです。

  • date:日付を表現し、属性として年(year)、月(month)、日(day)を持つ
  • time:1日の中の時間を表現し、属性として時間(hour)、分(minute)、秒(second)、マイクロ秒(microsecond)、そしてオプションでタイムゾーン情報(tzinfo)を持つ
  • datetime:日付と時間を合わせて表現し、dateクラスとtimeクラスの両方の属性を持つ
  • timedelta:2つの日付または時間の間の差を表現する

timedeltaについては以下で詳しく説明しています。

Aware(アウェア)とNaive(ナイーヴ)の違い

Datetimeオブジェクトがアウェアかナイーブかを判断するためには、そのオブジェクトがタイムゾーン情報を持っているかどうかを確認します。

アウェアオブジェクトは、世界中のどこであっても一意の時刻を表現します。

一方、ナイーブオブジェククトはタイムゾーン情報を持たないため、その時刻が何を表しているのかは明確ではありません。

以下に、Pythonのdatetimeオブジェクトがアウェアかナイーブかを判断するコード例を示します。

from datetime import datetime, timezone

# アウェアなdatetimeオブジェクト
aware_datetime = datetime.now(timezone.utc)
print(aware_datetime.tzinfo)  # <UTC>

# ナイーヴなdatetimeオブジェクト
naive_datetime = datetime.now()
print(naive_datetime.tzinfo)  # None

tzinfo属性を確認することで、オブジェクトがアウェアかナイーブかを判断可能です。

Datetimeモジュールのインポート

Pythonで日付や時刻を操作するためにはまず、datetimeモジュールをインポートする必要があります。

import datetime

datetimeは、Pythonの標準ライブラリに含まれています。

インポートが完了すれば、このモジュールが提供するクラスや関数が利用可能です。

Datetimeオブジェクト

datetimeオブジェクトは日付と時間を一緒に扱うためのオブジェクトです。

こちらでは、現在の日付と時間を取得する方法、datetimeコンストラクタの使い方、日付と時間オブジェクトからdatetimeオブジェクトを作成する方法を紹介します。

  • now():現在時刻にアクセス
  • コンストラクタ:オブジェクトの作成
  • Datetime型からDate型やTime型として抽出
  • DateやTime型からDateTime型へ変換

now():現在時刻にアクセス

datetimeモジュールの、now()関数を使って現在の日付と時間を取得できます。

以下がそのコード例です。

from datetime import datetime

now = datetime.now()
print(now)  # 2023-06-28 15:34:56.123456

現在の日付と時間をdatetimeオブジェクトとして取得し、それを表示します。

コンストラクタ:オブジェクトの作成

datetimeオブジェクトは、コンストラクタを使って指定した日付と時間で作成できます。

コード例はこちら。

from datetime import datetime

dt = datetime(2023, 6, 28, 15, 34, 56, 123456)
print(dt)  # 2023-06-28 15:34:56.123456

このコードでは、datetimeのコンストラクタを使って2023年6月28日15時34分56.123456秒を表すdatetimeオブジェクトを作成しています。

Datetime型からDate型やTime型へ変換

Datetimeオブジェクトから、それぞれ日付(date)オブジェクトと時間(time)オブジェクトを抽出可能です。

日付や時間の特定の部分に対して操作します。

具体的な方法としては、date()メソッドとtime()メソッドを使用します。

以下がその例です。

from datetime import datetime

# 現在の日時を取得
dt = datetime.now()

# datetimeオブジェクトから日付オブジェクトを取得
date_obj = dt.date()
print(date_obj)  # 2023-06-30

# datetimeオブジェクトから時間オブジェクトを取得
time_obj = dt.time()
print(time_obj)  # 15:30:45

現在の日時から日付と時間を抽出しています。

date()メソッドは年、月、日の情報を持つdateオブジェクトを返し、time()メソッドは時間、分、秒、マイクロ秒の情報を持つtimeオブジェクトを返します。

こうした機能は、例えば特定の日時から日付や時間のみを抽出して分析する際に非常に便利です。

DateやTime型からDateTime型へ変換

dateオブジェクトとtimeオブジェクトからdatetimeオブジェクトの作成も可能です。

以下のコード例を参考にしましょう。

from datetime import datetime, date, time

d = date(2023, 6, 28)
t = time(15, 34, 56, 123456)

dt = datetime.combine(d, t)
print(dt)  # 2023-06-28 15:34:56.123456

指定した日付を表すdateオブジェクトと指定した時間を表すtimeオブジェクトを作成。

datetime.combine()関数を使用してこれらを組み合わせてdatetimeオブジェクトを作成しています。

Dateオブジェクト

こちらからは、Pythonのdateオブジェクトについて詳しく解説していきます。

このオブジェクトは日付情報を表現し、時刻情報は含まれません。

  • 今日の日付を取得
  • Date型のコンストラクタ

今日の日付を取得

date.today()メソッドを使用すると、現在の日付を取得できます。

具体的な使用方法はこちら。

from datetime import date

d = date.today()
print(d)  # 2023-06-28 (実行日による)

現在の日付を取得し、それを表示しています。

Date型のコンストラクタ

dateオブジェクトは、コンストラクタを使い、特定の日付で作成も可能。

その例を以下に示します。

from datetime import date

d = date(2023, 6, 28)
print(d)  # 2023-06-28

dateのコンストラクタを使って2023年6月28日を表すdateオブジェクトを作成しています。

Timeオブジェクト

こちらでは、Pythonのtimeオブジェクトについて詳しく解説します。

このオブジェクトは時間情報を表現し、日付情報は含まれません。

  • 現在時刻を取得
  • Time型のコンストラクタ

現在時刻を取得

現在の時間を取得するには、datetimeモジュールのdatetime.now()メソッドとtimeメソッドを組み合わせます。

以下がその例です。

from datetime import datetime

t = datetime.now().time()
print(t)  # 15:34:56.123456 (実行時間による)

現在の時間を取得し、表示しています。

Time型のコンストラクタ

timeオブジェクトも、コンストラクタを使って特定の時刻のインスタンスが作れます。

以下のコードを参考にしてください。

from datetime import time

t = time(13, 45, 30)  # 13時45分30秒
print(t)  # 13:45:30

timeのコンストラクタを使って13時45分30秒を表すtimeオブジェクトを作成しています。

Timedeltaオブジェクト

timedeltaオブジェクトは、2つの日付や時間の間の差を表現します。

これは一連の日付や時間の操作に特に便利なオブジェクトで、それらを加算、減算、乗算、除算が可能です。

  • 引き算で作るtimedeltaオブジェクト
  • timedelta型のコンストラクタ
  • timedelta型の算術操作

timedeltaについてはこちらで詳しく解説しています。

【便利】Pythonのtimedeltaを完全マスター|実例付
Pythonの「timedelta」について知りたいですか?timedeltaは時間差を扱うことができる非常に便利なツールです。当記事では、timedeltaの具体的な使用方法を詳細なコード付きで丁寧に解説しています。特にPython初心者の方にとって、見逃せない情報が満載です。

引き算で作るtimedeltaオブジェクト

dateまたはdatetimeオブジェクトの間に、算術演算子-を使用して、timedeltaオブジェクトが生成できます。

以下がその例です。

from datetime import date

date1 = date(2023, 6, 28)
date2 = date(2023, 7, 7)
delta = date2 - date1
print(delta)  # 9 days, 0:00:00

2つの日付の差を計算し、それをtimedeltaオブジェクトとして表示しています。

timedelta型のコンストラクタ

timedeltaコンストラクタを使って、特定の時間差を表すtimedeltaオブジェクトを直接作成可能です。

from datetime import timedelta

delta = timedelta(days=7, hours=2)
print(delta)  # 7 days, 2:00:00

timedeltaのコンストラクタを使って、7日2時間を表すtimedeltaオブジェクトを作成しています。

timedelta型の算術操作

timedeltaオブジェクト同士での算術操作や、datedatetimeオブジェクトとの組み合わせによる算術操作も可能です。

以下に具体的な使用例を示します。

from datetime import datetime, timedelta

# timedeltaの加算
delta1 = timedelta(days=7, hours=3)
delta2 = timedelta(hours=5)
result = delta1 + delta2
print(result)  # 7 days, 8:00:00

# datetimeとtimedeltaの加算
now = datetime.now()
in_one_week = now + timedelta(days=7)
print(in_one_week)  # 現在時刻から一週間後のdatetimeオブジェクト

現在のdatetimeオブジェクトと新しいtimedeltaオブジェクトを加算して、一週間後の日時を表示しています。

tzinfoオブジェクトとtimezoneオブジェクト

Pythonのdatetimeモジュールでは、tzinfoオブジェクトを使用して日付と時間の情報にタイムゾーンを追加できます。

Python 3.2以降では、timezoneクラスも提供されており、これを使ってタイムゾーン情報を簡単に作成・管理が可能。

tzinfoクラス

tzinfoについては以下を覚えておきましょう。

  • tzinfoは抽象基底クラスで、タイムゾーンに関する情報を持っている
  • tzinfoクラス自体は具体的なタイムゾーンの実装を提供していない
  • 具体的なタイムゾーン情報を使用するにはこのクラスを継承した具体クラスを作成する必要がある

timezoneクラス

timezoneクラスは、Python 3.2から追加された、tzinfoを継承したクラスです。

UTCと固定のオフセット(UTCからのずれ)を表す具体的なタイムゾーンを提供します。

timezonにより、特定のタイムゾーンを明示的に指定することが簡単になったのです。

以下が例になります。

from datetime import datetime, timedelta, timezone

# UTC
utc_tz = timezone(timedelta(hours=0))
print(datetime.now(utc_tz))  # UTCの現在の日時を取得

# 日本のタイムゾーン(UTC+9)
jst_tz = timezone(timedelta(hours=9))
print(datetime.now(jst_tz))  # JSTの現在の日時を取得

# New Yorkのタイムゾーン(UTC-5)
ny_tz = timezone(timedelta(hours=-5))
print(datetime.now(ny_tz))  # New Yorkの現在の日時を取得

timezoneクラスを使って以下を指定しました。

  • UTC(世界協定時刻)
  • 日本時間(JST: Japan Standard Time)
  • ニューヨーク時間

datetime.now()関数にこれらのタイムゾーンオブジェクトを引数として渡すことで、指定したタイムゾーンの現在の日時を取得できます。

タイムゾーンの指定は、国際的なサービスや複数のタイムゾーンをまたぐプロジェクトでは重要な機能といえるでしょう。

Datetimeフォーマット:strftime()とstrptime()

strftime()とstrptime()についてお伝えします。

文字列型と日付・時間型を相互に行ったり来たりできるものです。

  • strftime: Date・Time型から文字列へ
  • strptime: 文字列型からDate・Time型へ
  • フォーマットコード一覧:変換に必須

strftime: Date・Time型から文字列へ

strftime関数は、datetimedatetimeオブジェクトを文字列に変換するもの。

各種日付と時間の要素(年、月、日、時、分、秒など)に対応するフォーマットコードを使って、出力される文字列の形式を指定できます。

以下がその例です。

from datetime import datetime

now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)  # 現在の日付と時間を"YYYY-MM-DD HH:MM:SS"の形式で出力

strftime関数を使って現在の日付と時間を特定の形式で表示しています。

こちらで詳しいコードなどを書いています。

【書式コード一覧付】Pythonのstrftimeをマスターしよう
Pythonで「strftime」関数を使用する方法を知りたいですか?strftime関数は日時データを様々な形式に表現し、プログラム内で効率的に操作するための基本的なツールです。当記事では、Pythonのstrftime関数の使用法を具体的なコード付きで詳細に解説しています。特にPython初心者の方は必見です。

strptime: 文字列型からDate・Time型へ

strptime関数は、strftime関数とは逆の操作をおこなう関数です。

文字列を解析してdatetimeオブジェクトに変換します。

解析する文字列と、その文字列の形式を表すフォーマットコードを引数として受け取ります。

例はこちら。

from datetime import datetime

datetime_str = "2023-01-01 12:30:45"
datetime_obj = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S")
print(datetime_obj)  # 2023-01-01 12:30:45

このコードでは、特定の形式の文字列をstrptime関数を使用してdatetimeオブジェクトに変換しています。

フォーマットコード:変換に必須

strftimeやstrptimeメソッドで使用するフォーマットコードには以下のものがあります。

下記の表では、フォーマットコード、その説明、およびそれぞれの例を列挙しています。

フォーマットコード説明
%a曜日の省略名Mon
%A曜日のフルネームMonday
%w曜日を数値で (0 = 日曜)3
%d月の日付を2桁の数値で07
%b月の省略名Jul
%B月のフルネームJuly
%m月を2桁の数値で07
%y年の下2桁23
%Y年を4桁で2023
%H24時間制の時間 (00-23)14
%I12時間制の時間 (01-12)02
%pAMまたはPMPM
%M分 (00-59)05
%S秒 (00-59)09
%fマイクロ秒 (6桁の数値)123456
%zUTCオフセット (±HHMMまたは±HHMMSS形式)+0900
%Zタイムゾーン名JST
%j年の通算日 (001-366)188
%U年の週番号 (日曜を週の始まりとし、00-53)28
%W年の週番号 (月曜を週の始まりとし、00-53)27
%cロケールの適切な日付と時刻の表現Thu Jul 7 14:05:09 2023
%xロケールの適切な日付の表現07/07/23
%Xロケールの適切な時刻の表現14:05:09

これらのフォーマットコードを組み合わせることで、様々な形式の日時文字列を生成または解析することができます。

実世界での利用例

Pythonのdatetimeモジュールは、以下のような場面で使われます。

  • リアルタイムのデータ分析
  • ログの解析
  • 日付と時間の算出

日付の範囲を指定してデータベースからデータを抽出したり、特定の時間帯にログエントリが多いかどうかを分析したりします。

具体例を見てみましょう。

import sqlite3
from datetime import datetime, timedelta

# データベースに接続
conn = sqlite3.connect('example.db')

# カーソルを取得
cursor = conn.cursor()

# 過去一週間を取得
one_week_ago = datetime.now() - timedelta(days=7)

# 過去一週間のデータを抽出
cursor.execute("SELECT * FROM my_table WHERE date > ?", (one_week_ago,))
rows = cursor.fetchall()

for row in rows:
    print(row)

現在から1週間前の日付を計算し、その日付以降に追加されたデータをデータベースから抽出しています。

特定の時間帯のログエントリの分析の例も見てみましょう。

ログファイルを分析する際に、特定の時間帯(たとえば午前2時から4時まで)にエントリが多いかどうかを確認したい場合もあります。

from datetime import datetime

log_entries = []
with open('example.log', 'r') as file:
    for line in file:
        time_string = line.split()[0]  # 仮定:各行は時間で始まる
        time = datetime.strptime(time_string, '%Y-%m-%d %H:%M:%S')
        
        if 2 <= time.hour < 4:  # 2時から4時までのエントリをチェック
            log_entries.append(line)

print(f"Number of log entries between 2am and 4am: {len(log_entries)}")

ログファイルの各行から時間を抽出し、その時間が2時から4時までの間にあるかどうかをチェックしています。

まとめ

当記事では、Pythonのdatetimeモジュールの主要な部分と使用方法について学習してきました。

日付と時間は、多くのプログラムで一般的に必要な要素です。

datetimeモジュールはこれらを効率的に扱うための多くの機能を提供しています。

理解と練習を深めるために、この記事で紹介した各機能を自身のコードに組み込み、使用してみましょう。

タイトルとURLをコピーしました