(最終更新月:2023年7月)
✔当記事は以下のような方に向けて書かれています
「Pythonのdatetimeはどんな機能を持っているのだろう?」
「Pythonのdatetimeの使い方をマスターしたい」
「Pythonのdatetimeの実践的な例を知りたい」
✔当記事で解説する内容
- Pythonのdatetimeの概要
- Pythonのdatetimeの正確な操作法とその応用
- Pythonのdatetimeを用いた具体的な例
当記事では、Pythonのdatetimeの基本機能から、その応用技術まで、具体的な例を交えて詳しく説明しています。
ぜひ最後までご覧ください。
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についてはこちらで詳しく解説しています。
引き算で作る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
オブジェクト同士での算術操作や、date
やdatetime
オブジェクトとの組み合わせによる算術操作も可能です。
以下に具体的な使用例を示します。
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
関数は、date
、time
、datetime
オブジェクトを文字列に変換するもの。
各種日付と時間の要素(年、月、日、時、分、秒など)に対応するフォーマットコードを使って、出力される文字列の形式を指定できます。
以下がその例です。
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
関数を使って現在の日付と時間を特定の形式で表示しています。
こちらで詳しいコードなどを書いています。
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 |
%H | 24時間制の時間 (00-23) | 14 |
%I | 12時間制の時間 (01-12) | 02 |
%p | AMまたはPM | PM |
%M | 分 (00-59) | 05 |
%S | 秒 (00-59) | 09 |
%f | マイクロ秒 (6桁の数値) | 123456 |
%z | UTCオフセット (±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
モジュールはこれらを効率的に扱うための多くの機能を提供しています。
理解と練習を深めるために、この記事で紹介した各機能を自身のコードに組み込み、使用してみましょう。