Global lo0

One good turn deserves another. GPS×ImageProcess×...

Python × 日付時刻

Python × 日付時刻

の初めての技術記事です.どうぞよろしくお願いします.

f:id:kuri_megane:20180923185909p:plain

初記事は,Pythonについてです.


ざっくりまとめると

  • Pythonには,日付,時刻,日付と時刻の両方を扱えるオブジェクトがある
  • 文字列から生成することもできる
  • 比較がうまくいかないときは,datetime.datetime.replace() が良いかも.

目次


datetimeモジュール

Pythonには,標準でdatetimeモジュールというものがあります.

これは,日付や時刻を扱うのに特化したモジュールで,何かと便利です.

まずは,よく使う簡単な例を紹介します.

日付型,時刻型のオブジェクト生成

日付型 (date型)

  • 2018年4月1日のオブジェクトを作りたい場合
>>> import datetime
>>> d = datetime.date(year=2018, month=6, day=1)
>>> d
datetime.date(2018, 6, 1)
  • 実行したその日のオブジェクトを作りたい場合
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2018, 6, 2)

非常に簡単な例ですが,日付オブジェクトができました.

時刻型 (time型)

  • 10時00分のオブジェクトを作りたい場合
>>> import datetime
>>> t = datetime.time(hour=10, minute=00)
>>> t
datetime.time(10, 0)

このようにすると時刻オブジェクトができます.

日付時刻型 (datetime型)

日付型と時刻型を合わせたのが日付時刻型です.

  • 2018年6月1日10時00分のオブジェクトを作りたい場合
>>> import datetime
>>> dt = datetime.datetime(year=2018, month=6, day=1, hour=10, minute=0)
>>> dt
datetime.datetime(2018, 6, 1, 10, 0)
  • 実行したその時のオブジェクトを作りたい場合
>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2018, 6, 1, 18, 59, 19, 612019)

秒,マイクロ秒まで値があることがわかります.

オブジェクトの利用例

2つのオブジェクトの差を算出する.つまり時間差を求める.

>>> import datetime
>>> dt1 = datetime.datetime(2018, 6, 1, 19, 0)
>>> dt2 = datetime.datetime(2018, 6, 1, 19, 5)
>>> sa = dt2 - dt1
>>> sa
datetime.timedelta(0, 300)

5分なので,300秒の差だとわかります.

>>> wa = dt1 + dt2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'datetime.datetime'

和はできません.(和とは不自然ですね)

ここで,timedeltaという新しいオブジェクトが出てきました.

timedelata型オブジェクト

timedelta型オブジェクトとは,その名の通り,時刻差のオブジェクトです.

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2018, 6, 1, 19, 12, 54, 348903)
>>> de = datetime.timedelta(minutes=5) 
>>> de
datetime.timedelta(0, 300)
>>> now + de
datetime.datetime(2018, 6, 1, 19, 17, 54, 348903)

5分のオブジェクトを時刻日付型に足せば,5分経過したオブジェクトが生成されます.

strftime, strptime

datetime型は文字列から作ったり,逆にdatetime型から文字列を生成することができます.

  • datetime型 -> 文字列
>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2018, 6, 1, 19, 16, 45, 656096)
>>> now.strftime("%Y年%m月%d日の%p%l時(%H時)")
'2018年06月01日のPM 7時(19時)'

このように,書式化コード (ex. %Y) を使って,好きな文字列に整形することができます.( cf. 書式化コードの一覧 )

逆もまたできます.

  • 文字列 -> datetime型
>>> import datetime
>>> str = "2018/06/01 19:25:00"
>>> dt = datetime.datetime.strptime(str,"%Y/%m/%d %H:%M:%S")
>>> dt
datetime.datetime(2018, 6, 1, 19, 25)

書式化コードでdatetime型オブジェクトが簡単に作れることがわかります.

比較をする

ここまでのオブジェクトを使うと時刻の比較,つまりどちらのほうが後の時間か,も調べることができます.

  • datetime型 vs datetime型の比較
>>> import datetime
>>> dt1 = datetime.datetime(2018, 6, 1, 19, 0)
>>> dt2 = datetime.datetime(2018, 6, 1, 19, 5)
>>> dt1 < dt2
True

これは特に意識することなくできます.

  • date型 vs date型,time型 vs time型
>>> import datetime
>>> d1 = datetime.date(2018, 6, 1)
>>> d2 = datetime.date(2018, 6, 2)
>>> d1 < d2     # date型 vs date型
True
>>> t1 = datetime.time(19, 0)
>>> t2 = datetime.time(19, 5)
>>> t1 > t2     # time型 vs time型
False

こちらも直感通りです.

  • datetime型 vs date型,datetime型 vs time型

任意のdatetime型と,特定の日付または特定の時刻を比較する場合です.

>>> import datetime
>>> dt = datetime.datetime(2018, 6, 1, 19, 0)
>>> d = datetime.date(2018, 6, 1)
>>> dt < d      # datetime型 vs date型
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot compare datetime.datetime to datetime.date
>>> dt = datetime.datetime(2018, 6, 1, 19, 0)
>>> t = datetime.time(19, 5)
>>> dt < t      # datetime型 vs time型
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'datetime.datetime' and 'datetime.time'

いずれもできません.これらは,比較に必要な情報を補う必要があります.

ここで,公式リファレンス では,次のように書かれています.

これらの型(date型,time型,datetime型等)のオブジェクトは変更不可能 (immutable) です。

よって,date型とtime型をdatetime型で代用することを考えます.

すると,datetime.datetime.replace() ( cf. 公式リファレンス ) というモジュールがあるではないですか!

>>> import datetime
>>> dt = datetime.datetime(2018, 6, 1, 19, 0)
>>> # d = datetime.date(2018, 6, 1)
>>> d = dt.replace(year=2018, month=6, day=1)
>>> d
datetime.datetime(2018, 6, 1, 19, 0)
>>> d < dt
False
>>> dt = datetime.datetime(2018, 6, 1, 19, 0)
>>> # t = datetime.time(19, 5)
>>> t = dt.replace(hour=19, minute=5)   
>>> t
datetime.datetime(2018, 6, 1, 19, 5)
>>> dt < t
True

date型とtime型の代わりを,比較対象のdatetime型を置き換えることで実現できそうです.

最後に

datetimeオブジェクトは,date型,time型,datetime型などいくつかの型があり,それぞれは便利ですが,混合する場合には工夫が必要になると思います.

公式ドキュメント,よく見ておくのが良いですね.