TIL

Today I Learned. 知ったこと、学んだことを書いていく

datatimeモジュール - Python

入門 Python 3 に記載されていた日付と時刻の扱いについてまとめてみた。忘れてもいいようにメモとして残しておく。


Pythonで日時や時刻を扱うときの一つの方法として、標準モジュールのdatetimeモジュールがある。このモジュールには主なオブジェクト(クラス?)が4つある。

  • date...年月日を扱う
  • time...時分秒を扱う
  • datetime...日付と時刻を扱う
  • timedelta...日付と時刻の間隔を扱う

まずはdateオブジェクトから。

date

dateオブジェクトは年月日を指定することで生成できる。年月日はぞれぞれ属性として取り出せる。

>>> from datetime import date
>>> birthday = date(1998, 3, 24)
>>> birthday
datetime.date(1998, 3, 24)
>>> birthday.year
1998
>>> birthday.month
3
>>> birthday.day
24
>>> birthday.isoformat()
'1998-03-24'

birthday.isoformat()で日付の文字列を取得できる。ISOとは日時表現の国際標準でISO 8601のこと。

また、dateオブジェクトの範囲は以下のようになっているため紀元前の日付や天文学的な時間の計算(?)ではdateオブジェクトは使えない。

>>> date.min
datetime.date(1, 1, 1)
>>> date.max
datetime.date(9999, 12, 31)


次は、日付と時刻の間隔を扱えるtimedeltaオブジェクト。

timedelta

次のソースではtoday()メソッドを使って今日の日付を取得している。

>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2017, 10, 9)

次に、timedeltaオブジェクトを使い、今日の1日後、7日後、1日前の日付を取得する。

>>> from datetime import timedelta
>>> one_day = timedelta(days=1)
>>> tomorrow = now + one_day
>>> tomorrow
datetime.date(2017, 10, 10)
>>> now + (7 * one_day)
datetime.date(2017, 10, 16)
>>> yesterday = now - one_day
>>> yesterday
datetime.date(2017, 10, 8)

timedeltaオブジェクトを使い、演算ができるのは直感的でいいと思った。

次は、時刻を扱うためのtimeオブジェクト。

time

>>> from datetime import time
>>> noon = time(12, 0)
>>> noon
datetime.time(12, 0)
>>> noon.hour
12
>>> noon.minute
0
>>> noon.second
0
>>> noon.microsecond
0

timeオブジェクトを生成するときには大きな単位から順に指定する(時, 分, 秒, マイクロ秒)。すべての引数の値は0がデフォルトとなっているため、省略された場合には0になる。

また、時、分、秒、マイクロ秒のそれぞれはプロパティで定義されているため、簡単に取得できる。※ マイクロ秒の値はコンピュータの内と全く同じ値にはなっていないことに注意すること。


次は、日時と時刻を扱うためのdatetimeオブジェクト。

datetime

次のようにしてdatetimeオブジェクトを作成できる。この例では2017年1月2日3時4分5秒6μ秒のdatetimeオブジェクトを作っている。

>>> from datetime import datetime
>>> some_day = datetime(2017, 1, 2, 3, 4, 5, 6)
>>> some_day
datetime.datetime(2017, 1, 2, 3, 4, 5, 6)
>>> some_day.isoformat()
'2017-01-02T03:04:05.000006'

datetime.isoformat()メソッドでISOの書式の文字列が取得できる。Tが日付と時刻の境目となっている。

現在の日時と時刻を取得するためにはnow()メソッドを使う。

>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2017, 10, 9, 23, 17, 23, 376254)

また、年、月、日、時、分、秒、マイクロ秒はプロパティとして定義されているため簡単に取得できる。

>>> now.year
2017
>>> now.month
10
>>> now.day
9
>>> now.hour
23
>>> now.minute
17
>>> now.second
23
>>> now.microsecond
376254


datetime.combine()メソッドを使うことでdateオブジェクトとtimeオブジェクトを結合してdatetimeオブジェクトを生成できる。

>>> from datetime import datetime , time, date
>>> t = time(23, 30)
>>> this_day = date.today()
>>> dt = datetime.combine(this_day, noon)
>>> dt
datetime.datetime(2017, 10, 9, 23, 30)
>>> dt.isoformat()
'2017-10-09T23:30:00'

この例ではマイクロ秒を指定していないため、datetime.isoformat()メソッドで取得できる値もマイクロ秒は含まれていない。

逆に、date()time()メソッドを使えばdatetimeからdate、timeをちゅうしゅつできる。

>>> dt.date()
datetime.date(2017, 10, 9)
>>> dt.time()
datetime.time(23, 30)

週番号を取得 (2017/10/13 追記)

datetimeオブジェクトで週番号を取得するにはdatetime.weekday()メソッドを使う。(datetime.weekday)

>>> from datetime import datetime
>>> dt = datetime.now()
>>> dt
datetime.datetime(2017, 10, 13, 8, 0, 25, 26142)
>>> dt.weekday()
4

weekday()で取得できる週番号は「0が月曜日」、「6が日曜日」となっている。4ということは金曜日ということになる。



参考文献

github.com

入門 Python 3

入門 Python 3