Pythonで日時を扱う際に使用するのが、datetimeモジュールです。
日時の取得や日数計算、特定のフォーマットに基づいた文字列変換など、様々な処理を実行することができます。
今回は、datetimeモジュールの使い方について詳しく解説していきたいと思います。
Pythonの datetime モジュールとは?
datetimeモジュールは、Pythonの標準ライブラリの1つであり、日時に関する処理を行うことができるモジュールです。
日付や時刻を操作するための様々なクラスを提供している他、日時から文字列、或いは文字列から日時へと、データ型を変換する各メソッドを使用することにより、多様なフォーマットに対応することができます。
また、「〇〇日前」 や 「〇〇時間後」 といったように、特定の日時を基に日数や時間を計算する際に、足し算や引き算を利用して日時を求めることも可能です。
タイムゾーンにも対応しているため、時差を考慮した時刻の計算や比較を行うこともできます。
datetimeモジュールでは、それぞれの用途に合わせて以下のクラスが用意されています。
- datetime.datetime … 日付と時刻
- datetime.date … 日付
- datetime.time … 時刻
- datetime.timedelta … 時間差 (経過時間)
datetimeオブジェクトの使い方
まずは、日付と時刻の両方を扱うことのできる datetimeオブジェクトについて、詳しい使い方を確認していきましょう。
基本構文
datetimeオブジェクトは、以下のコンストラクタを通して、任意の日時の datetimeオブジェクトを生成することができます。
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, fold=0)年(year)、月(month)、日(day) の3つの引数が必須項目で、その他の引数は省略可能です。
省略した場合のデフォルト値は 0 となっています。
また、各引数に指定する値は、以下の範囲の整数である必要があります。
- year … MINYEAR <= year <= MAXYEAR
- month … 1 <= month <= 12
- day … 1 <= day <= 指定した月の日数
- hour … 0 <= hour < 24
- minute … 0 <= minute < 60
- second … 0 <= second < 60
- microsecond … 0 <= microsecond < 1000000
from datetime import datetime
date1 = datetime(2020, 1, 1)
date2 = datetime(2020, 12, 31, 15, 30, 20, 1000)
print(date1)
print(date2)2020-01-01 00:00:00
2020-12-31 15:30:20.001000datetime.now()で現在の日付と時刻を取得する
現在時刻を取得したい場合は、 datetimeクラスの nowメソッドを使用しましょう。
from datetime import datetime
date_now = datetime.now()
print(date_now)2026-03-30 16:13:42.195420タイムゾーンを指定したい場合は、メソッドの引数に渡すことができます。
from datetime import datetime
from zoneinfo import ZoneInfo
now_usa = datetime.now(ZoneInfo("America/Los_Angeles"))
print(now_usa)2026-03-30 00:27:13.661733-07:00datetimeで使用される主な属性
datetimeクラスには、様々なクラス属性が存在します。
その中でも主に使用される属性は、以下の年月日と時分秒です。
- year (年)
- month (月)
- day (日)
- hour (時)
- minute (分)
- second (秒)
特定の日時を取得した datetimeオブジェクトを使用して、各属性にアクセスすることができます。
from datetime import datetime
date_now = datetime.now()
print(f"{date_now.year}年")
print(f"{date_now.month}月")
print(f"{date_now.day}日")
print(f"{date_now.hour}時")
print(f"{date_now.minute}分")
print(f"{date_now.second}秒")2026年
3月
30日
16時
48分
56秒各属性の値は、int型で取得されます。
dateオブジェクトで日付を扱う
datetimeモジュールの中で、日付のみに関する情報を扱うのが dateクラスです。
以下のコンストラクタを使用して、任意の日付を dateオブジェクトとして取得することができます。
date(year, month, day)datetimeオブジェクトと同様に、year、month、day の3つが必須となるため、引数の省略はできません。
値の指定可能範囲は datetimeオブジェクトと同様となります。
from datetime import date
date = date(2020, 1, 1)
print(date)2020-01-01date.today()で今日の日付を取得する
dateオブジェクトで現在の日時を取得する場合は、todayメソッドを使用します。
from datetime import date
date_now = date.today()
print(date_now)
#datetimeクラス同様、属性ごとに取得可能
print(f"{date_now.year}年{date_now.month}月{date_now.day}日")2026-03-30
2026年3月30日timeオブジェクトで時刻を扱う
dateオブジェクトが日付のみを扱うのに対し、時刻のみを扱うのが timeオブジェクトです。
以下のコンストラクタを使用して、任意の時刻を timeオブジェクトとして取得することができます。
time(minute=0, second=0, microsecond=0, tzinfo=None, fold=0)timeオブジェクトの場合は、全ての引数を省略可能です。
省略した場合のデフォルト値は上述の通りとなります。
値の指定可能範囲は、こちらも datetimeオブジェクトと同様です。
from datetime import time
time = time(15, 30, 20, 1000)
print(time)15:30:20.001000time()メソッドでdatetimeオブジェクトをtimeオブジェクトに変換する
timeオブジェクトには、datetimeオブジェクトや dateオブジェクトにあったような現在時刻を取得するためのメソッドが用意されていません。
そのため、現在時刻を取得したい場合は、datetime.now()で現在日時を取得してから、timeメソッドで timeオブジェクトに変換するようにしましょう。
from datetime import datetime, time
time_now = datetime.now().time()
print(time_now)17:46:25.513250timedeltaオブジェクトで時間差や経過時間を表現する
2つの日時の時間差を求める場合に使用するのが、timedeltaオブジェクトです。
使用する際のコンストラクタは、以下の通りです。
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)引数は全て省略可能です。
timedeltaオブジェクトが所持する情報は days, seconds, microseconds の3つのみで、その他の引数は以下の基準でそれぞれ変換されます。
- 1 ミリ秒 = 1000 マイクロ秒に変換
- 1 分 = 60 秒に変換
- 1 時間 = 3600 秒に変換
- 1 週間 = 7 日に変換
timedeltaオブジェクトを使用することで、datetimeオブジェクトとの足し算や引き算が可能となります。
from datetime import datetime, timedelta
date = datetime(2020, 12, 31, 15, 30, 20, 1000)
print(date + timedelta(weeks=1))
print(date - timedelta(hours=1))2021-01-07 15:30:20.001000
2020-12-31 14:30:20.001000また、datetimeオブジェクト同士や dateオブジェクト同士で引き算することもでき、その場合の結果は timedeltaオブジェクトで返されます。
from datetime import datetime, timedelta
date1 = datetime(2020, 12, 31, 17, 30, 20, 1000)
date2 = datetime(2020, 11, 30, 15, 40, 10, 1000)
result = date1 - date2
print(result)
print(type(result))31 days, 1:50:10
<class 'datetime.timedelta'>datetimeと文字列の変換
それぞれ対応するメソッドを使用することで、datetimeから文字列へ、あるいは文字列から datetimeへと変換することができます。
それぞれの方法について見ていきましょう。
strftime()で日付・時刻を文字列に変換する
datetime, date, time クラスがそれぞれ保持する strftimeメソッドを使用することで、オブジェクトを文字列に変換することができます。
オブジェクトが保持する各種情報は、メソッドの引数に指定した任意のフォーマットに従って変換されます。
フォーマットは、それぞれのデータに対応する書式コードを記述した文字列で指定します。
例えば、以下の例のような構文です。
date.strftime('%Y/%m/%d %H:%M:%S.%f')%とアルファベットの組み合わせで表現されているものが書式コードです。
代表的な書式コードをいくつか紹介します。
- %d … 0埋めした10進数表記の日にち
- %m … 0埋めした10進数表記の月
- %y … 0埋めした10進数表記の西暦(下2桁)
- %Y … 0埋めした10進数表記の西暦(4桁)
- %H … 0埋めした10進数表記の時 (24時間表記)
- %I … 0埋めした10進数表記の時 (12時間表記)
- %M … 0埋めした10進数表記の分
- %S … 0埋めした10進数表記の秒
- %f … 0埋めした10進数表記のマイクロ秒(6桁)
- %A … 曜日名
- %a … 曜日名(短縮形)
- %B … 月名
- %b … 月名(短縮形)
from datetime import datetime
date = datetime(2020, 12, 31, 17, 30, 20, 1000)
date_str1 = date.strftime('%Y/%m/%d %H:%M:%S.%f')
date_str2 = date.strftime('%Y年%m月%d日 %H時%M分%S秒')
print(date_str1)
print(date_str2)このように、任意のフォーマットで文字列に変換することができます。
strptime()で文字列を日付・時刻に変換する
反対に、datetimeクラスの strptimeメソッドを使用して、文字列を datetimeオブジェクトに変換することもできます。
datetime.strptime(対象文字列, フォーマット)メソッドの第一引数に変換対象の文字列、第二引数に文字列のフォーマットを指定します。
from datetime import datetime
date_str = '2020/12/31 17:30:20.001000'
str_format = '%Y/%m/%d %H:%M:%S.%f'
date = datetime.strptime(date_str, str_format)
print(date)2020-12-31 17:30:20.001000datetimeオブジェクトに変換することで、strftimeメソッドで別のフォーマットへと変換したり、timedeltaオブジェクトで日数計算を行ったりできるようになります。
まとめ
いかがでしたか?今回は、datetimeモジュールの使い方について解説しました。
各クラスごとに扱える情報や使用できるメソッドの種類が異なるので、使用用途に合わせて適切に使い分けられるよう、それぞれのクラスの違いをしっかりと把握しておくようにしましょう。
Pythonの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Pythonに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。