Data Science|Basics

Pythonのdatetimeを使いこなそう!現在日時取得から文字列変換まで

Pythonを学習していると

「datetimeモジュールの使い方がわからない」
「もっと網羅的にdatetimeについて知りたい」

などといった悩みを抱えることもありますよね。
そこで今回はdatetimeモジュールに関する知識や使い方を詳しく説明していきます。
ぜひ最後までご覧くださいね。

datetimeモジュールについて

「datetimeモジュール」とは、Pythonで日付や時刻に対してさまざまな操作をすることができるモジュールで、現在の時刻の取得から日時の計算、指定した形式での表示などを行うことができますよ。

datetimeモジュールのオブジェクトは以下の通りです。

  • datetime:日付と時刻を扱う
  • date:日付を扱う
  • time:時刻を扱う
  • timedelta:時間差を扱う

ここで、モジュール・オブジェクト・メソッドの関係性を紹介します。

モジュール よく使用する処理があらかじめまとめて定義されているファイル
オブジェクト 文字列・リスト・日付などのことで、データを扱うのに便利な関数を持っている
メソッド オブジェクトが持っている関数

つまり、モジュール・オブジェクト・メソッドの関係性をまとめると次のような階層構造になっていることがわかります。

モジュール 例: datetime
└ オブジェクト 例::datetime
└ メソッド 例::now( ) , strftime( )

それでは、datetimeモジュールに入っている4つのオブジェクトについて説明していきます。

datetimeオブジェクトについて

datetimeオブジェクトは日付と時刻の両方の情報を持っているオブジェクトで、「year」「month」「day」「hour」「minute」「second」「microsecond」などを利用してそれらの情報にアクセスできますよ。

datetimeモジュールを使用するには、「import」を忘れないように注意しましょう。

1. import datetime

datetime . now ( )

datetimeオブジェクトで、現在の日付と時刻を取得するには「datetime . now ( )メソッド」を使用します。

1.  import datetime
2.
3.  dt _ now = datetime . datetime . now ( )
4.  print ( dt _ now )
5.  # 実行結果
6.  2020 – 05 – 18 16 : 34 : 23 . 174812
7.
8.  print ( ‘年:’ , dt _ now . year )
9.  # 実行結果
10. 年:2020
11.
12. print ( ‘月:’ , dt _ now . month )
13. # 実行結果
14. 月:5
15.
16. print ( ‘日:’ , dt _ now . day )
17. # 実行結果
18. 日:18
19.
20. print ( ‘時:’ , dt _ now . hour )
21. # 実行結果
22. 時:16
23.
24. print ( ‘分:’ , dt _ now . minute )
25. # 実行結果
26. 分:34
27.
28. print ( ‘秒:’ , dt _ now . second )
29. # 実行結果
30. 秒:23
31.
32. print ( ‘マイクロ秒:’ , dt _ now . microsecond )
33. # 実行結果
34. マイクロ秒:174812

このように「datetime.datetime.now()」とすることで、変数「dt_now」に現在の日付や時刻を格納できました。この変数に対して「year」などのメソッドを使用することで、年月日時分秒マイクロ秒を取得できますよ。

datetimeオブジェクトのコンストラクタ

datetimeオブジェクトでは、任意の日付や時刻を作成することができますよ。

1. # datetimeオブジェクトのコンストラクタ
2. datetime ( year , month , day , hour=0 , second=0 , maicrosecond=0 , tzinfo=None )
3. # year・month・day以外は省略でき、省略した場合は初期値の0となる

実際にコードを用いて説明していきます。

1.  dt = datetime . datetime ( 2020 , 1 , 1 , 12 , 30 , 20 , 1230
2.  print ( dt )
3.  # 実行結果
4.  2020 – 01 – 01 12 : 30 : 20 . 001230
5.
6.  print ( dt . minute )
7.  # 実行結果
8.  30
9.
10. print ( dt . microsecond )
11. # 実行結果
12. 1230
13.
14. dt = datetime . datetime ( 2020 , 1 , 1 )
15. print ( dt )
16. # 実行結果
17. 2020 – 01 – 01 00 : 00 : 00
18.
19. print ( de . minute )
20. # 実行結果
21. 0

dateオブジェクトについて

dateオブジェクトは日付の情報を持っているオブジェクトで、「year」「month」「day」などの属性にアクセスすることができますよ。

day . today ( )

dateオブジェクトで現在の日付を取得するには「date . today ( )メソッド」を使用します。

1.  d _ today = datetime . date . today ( )
2.  print ( d _ today )
3.  # 実行結果
4.  2020 – 05 – 18
5.
6.  print ( d _ today . year )
7.  # 実行結果
8.  2020
9.
10. print ( d _ today . month )
11. # 実行結果
12. 5
13.
14. print ( d _ today . day )
15. # 実行結果
16. 18

このように、「datetime.date.today()」とすることで、変数「d_today」に現在の日付を格納することができます。この日付型変数に様々なメソッドを使用することで簡単に現在の日付を取得することができますよ。

dateオブジェクトのコンストラクタ

dateオブジェクトのコンストラクタは下記のようになっており、いずれも省略できないので注意しましょう。

1. # すべて必須
2. date ( year , month , day )

実際にコードを用いて説明していきます。

1. d = datetime . date ( 2020 , 1 , 1 )
2. print ( d )
3. # 実行結果
4. 2020 – 01 – 01
5.
6. print ( d. month )
7. # 実行結果
8. 1

このようにすべて必須ですので入力するのを忘れないようにしましょう。

timeオブジェクトについて

timeオブジェクトは時刻の情報を持っているオブジェクトで、「hour」「minute」「second」「microsecond」といった属性にアクセスすることができますよ。

time.time ( )

現在の時刻を取得するには「timeモジュール」をインポートして「time.time( )メソッド」を使用します。

time( )メソッドを使用すると現在のUNIX時間をfloat型で取得できます。UNIX時間とは、UTCの1970年1月1日0時0分0秒からの経過秒数のことです。

1. import time
2.
3. ut = time . time ( )
4.
5. print ( ut )
6. # 実行結果
7. 1590188275.118221

処理の経過時間も測定することができますよ。

timeオブジェクトのコンストラクタ

timeオブジェクトのコンストラクタは次のようになっており、いずれも省略することができます

1. # 省略した場合は0となる
2. time ( hour=0 , minute=0 , second=0 , microsecond=0 , tzinfo=None )

実際にコードを用いて説明していきます。

1.  t = datetime . time ( 12 , 30 , 20 , 1230 )
2.  print ( t )
3.  # 実行結果
4.  12 : 30 : 20 . 001230
5.
6.  print ( t . minute )
7.  # 実行結果
8.  30
9.
10. t = datetime . time ( )
11. print ( t )
12. # 実行結果
13. 00 : 00 : 00

このように省略すると初期値の0になることが分かるでしょう。

timedeltaオブジェクトについて

timedeltaオブジェクトは、2つの日時の時間差や経過時間を表すオブジェクトで、日数・秒数・マイクロ秒数の情報を持っており「days」「seconds」「microseconds」でアクセスできます。

また、「total _ seconds ( )メソッド」でトータル秒数を取得することもできますよ。

timedeltaオブジェクトを使用した引き算・足し算

timedeltaを使用することで日付の引き算や足し算を簡単に行うことができますよ。

実際にコードを用いて説明していきます。

1. today = datetime . date . today ( ) #現在日時はUTC2020-05-18
2. day _ after _ tomorrow = datetime . timedelta ( days = 5 )
3.
4. print ( today + day _ after _ tomorrow )
5. # 実行結果
6. 2020 – 05 – 23

現在の日付2020年5月18日から5日後の日付を表示することができました。
このとき、取得される日時はUTC時刻のため、日本での現地時間と異なることに注意してください。

このようにtimedeltaクラスの引数として任意の数値を渡すことで日時の計算が簡単に行えるようになりますよ。

また、下記のように日付を比較することも簡単ですよ。

1.  tomorrow = today + datetime . timedelta ( days = 1 )
2.  yestarday = today – datetime . timedelta ( days = 1 )
3.
4.  print ( ‘今日は明日よりも後:’ + str ( today > tomorrow ) )
5.  # 実行結果
6.  今日は明日よりも後:False
7.
8.  print ( ‘昨日は今日よりも前:’ + str ( yestarday < today ) )
9.  # 実行結果
10. 昨日は今日よりも前:True

上記のように昨日・今日・明日の日付を作成して比較することもできますよ。

datetimeオブジェクト同士の引き算でtimedeltaオブジェクト作成

datetimeオブジェクト・dateオブジェクトなど、datetimeオブジェクト同士を引き算するとtimedeltaオブジェクトを取得することができます。

1.  today=datetime.datetime.now() – datetime.datetime(1970,1,1)
2.  print ( today )
3.  # 実行結果
4.  18404 days, 23:19:08.702441
5.
6.  print ( today . days )
7.  # 実行結果
8.  18404
9.
10. print ( today . seconds )
11. # 実行結果
12. 83948
13.
14. print ( today . microseconds )
15. # 実行結果
16. 702441
17.
18. print ( today . total _ seconds ( ) )
19. # 実行結果
20. 1590189548.702441

このようにdatetimeオブジェクト同士の引き算でtimedeltaオブジェクトが取得できますよ。

timedeltaオブジェクトのコンストラクタ

timedeltaオブジェクトのコンストラクタは次のようになっており、いずれも省略することができますよ。

1. # 省略した場合は初期値の0となる
2. timedelta ( days=0 , seconds=0 , microseconds=0 , milliseconds=0 , minutes=0 , hours=0 , weeks=0 )

timedeltaオブジェクトが持っている情報は、あくまで「days」「seconds」「microseconds」のみなので注意してください。

1. td _ 1w = datetime . timedelta ( weeks=1 )
2. print ( td _ 1w )
3. # 実行結果
4. 7 days , 0 : 00 : 00
5.
6. print ( td _ 1w . days )
7. # 実行結果
8. 7

strftime( )・strptime( )について

ここからはstrftime( )とstrptime( )について説明していきます。最後に違いやそれぞれの覚え方も紹介しますので、ぜひ最後までご覧くださいね。

strftimeとは

「strftime( )メソッド」とは、「date」「time」または「datetimeオブジェクト」を使用して日付と時刻を表す文字列を返すメソッドです。

使用可能な書式化コードは下記の通りです。

コード 意味
%a ロケールの曜日名を省略形で表示。
%A ロケールの曜日名を表示。
%b ロケールの月名を省略形で表示。
%B ロケールの月名を表示。
%c ロケールの適切な日付および時刻の表示。
%d 10進数で月の始めから何日目かを表示。
%f 10進数でマイクロ秒を表示。
%G ISO weekの内過半数を含んだ西暦表記のISO 8601 year。
%H 10進数で24時間計での時を表示。
%I 10進数で12時間計での時を表示。
%j 10進数で年の初めから何日目かを表示。
%m 10進数で月を表示。
%M 10進数で分を表示。
%p ロケールのAM・PMに対応する文字列。
&S 10進数で秒を表示。
%u 月曜日を1とする10進数表記のISO 8601 weekday。
%U 10進数で年の初めから何週目かを表示。年明けから最初の日曜日までの全ての曜日は0週目。
%w 曜日を10進表記した文字列を表示。表示は日曜日が0・土曜日が6。
%W 10進数で年の初めから何週目かを表示。年明けから最初の月曜日までの全ての曜日は0週目。
%x ロケールの適切な日付を表示。
%X ロケールの適切な時刻を表示。
%y 10進数で上2桁のない西暦年を表示。
%Y 10進数で上2桁が付いている西暦年を表示。
%Z タイムゾーン名。タイムゾーンがない場合は空文字列。
%% 文字「%」を表示。

曜日名や月名の「%a」「%A」「%b」「%B」は、ロケールによって取得できる文字列が違うので気をつけましょう。

では、実際にコードを用いて使い方を説明していきます。

1.  today = datetime.datetime.now()
2.  print ( today . strftime ( ‘%Y – %m – %d %H : %M : %S’ ) )
3.  # 実行結果
4.  2020 – 05 -18 16 : 34 : 23
5.
6.  print ( today . strftime ( ‘%Y%M%d’ )
7.  # 実行結果
8.  200518
9.
10.  print ( today . strftime ( ‘%A , %B %d , %Y’ ) )
11. # 実行結果
12. Monday , May 18 , 2020
13.
14. print ( today . strftime ( ‘%Y年%m月%d日’ ) )
15. # 実行結果
16. 2020年05月18日
17.
18. print ( ‘日番号:’ , today . strftime ( ‘%j’ ) )   # 正月が001とした場合
19. print ( ‘週番号:’ , today . strftime ( ‘%U’ ) )   # 週の始まりは日曜日で正月が00とした場合
20. # 実行結果
21. 139
22. 18

文字列ではなく数値で取得したい場合は「int ( )」で整数に変換すれば数値を取得することができますよ。

strptimeとは

「strptime( )」とは、指定した日付や時刻の文字列から「datetimeオブジェクト」を作成することができるメソッドで、元の文字列に対応する書式化の文字列を指定する必要がありますよ。

1.  date _ str = ‘2020 / 5 / 18 16 : 34’
2.  date _ dt = datetime . datetime . strptime ( date _ str ,  ’%Y / %m / %d %H : %M’ )
3.  print ( date _ dt )
4.  # 実行結果
5.  2020 – 05 – 18 16 : 34 : 00
6.
7.  # strftime( )メソッドを使用することで元の文字列と違うフォーマットで表示
8.  print ( date _ dt . strftime ( ‘%Y年%m月%d日 %H時%M分’ ) )
9.  # 実行結果
10. 2020年05月18日 16時34分

また、datetimeオブジェクトに変換すればtimedeltaオブジェクトとの演算をすることができますので、同じフォーマットで10日前の日付の文字列を作成することもできますよ。

1.  date _ str = ‘2020年5月18日’
2.  date _ format = ‘%Y年%m月%d日’
3.  td _ 10 _ d = datetime . timedelta ( days = 10 )
4.
5.  date _ dt = datetime . datetime . strptime ( date _ str , date _ format )
6.  date _ dt _ new = date _ dt – td _ 10 _ d
7.  date _ str _ new = date _ dt _ new . strftime ( date _ format )
8.
9.  print ( date _ str _ new )
10. # 実行結果
11. 2020年05月18日

strftime( )とstrptime( )の違い

strftime( )・strptime( )、どちらも日付と文字列を変換するメソッドです。どっちがどっちのメソッドだったか悩まないように、ここでは違いや覚え方を紹介します。

「strftime( )」の「f」は「format」からきています。formatとは「書式」という意味があり、書式があるのは文字列のみなので、「日付→文字列」の変換をするメソッドがstrftime( )となります。

また、strftimeの「f」を「from」とみなして考えると「str from time」となります。つまり、時間・日付から文字列という意味になるため、strftimeは日付から文字列に変換するメソッドとなります。

「strptime( )」の「p」は「parse」からきています。parseとは「解析する」という意味があり、解析が必要なのは文字列なので、「文字列→日付」の変換をするメソッドがstrptime( )となります。

また、strptimeは「from」ではない方と覚えると良いでしょう。

それぞれの違いは以下の通りです。

  • strftime:日付から文字列
  • strptime:文字列から日付

まとめ

これまでPythonのdatetimeについて説明してきましたが、いかがでしたでしょうか。

今回説明した要点をまとめると以下のようになります。

  • datetimeモジュールとは、日付や時刻に対してさまざまな操作をすることができるモジュール
  • 現在の日付・時刻を取得するにはdatetime.datetime . now ( )を使用
  • 現在の日付を取得するにはdatetime.date . today ( )を使用
  • 時刻を取得するにはtime.time( )を使用
  • timedeltaオブジェクトは2つの日時の時間差や経過時間を表す
  • strftime( )は日付や時間の情報を任意の書式フォーマットの文字列に変換
  • strptime( )は日付や時刻を表す文字列からdatetimeオブジェクトを作成

datetimeを使用すれば簡単に日付や時刻を扱うことができるため、この機会にしっかり理解を深めておくと良いでしょう。

このブログでは他にも様々なPythonの関数について解説しています。ぜひご覧ください!

マスターしよう!Pythonでimportを使う方法について徹底解説!Pythonを学習し始めたばかりの人で「import」につまずいている人もいることでしょう。 そこで今回は import...
Pythonの出力関数printの要点をつかむ!基礎〜応用まで徹底解説Pythonを学習し始めたばかりの方で、print関数についてつまずいてしまう人も少なからずいるでしょう。 「Pythonのp...