Python × 日付時刻
Python × 日付時刻
僕 の初めての技術記事です.どうぞよろしくお願いします.
初記事は,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型などいくつかの型があり,それぞれは便利ですが,混合する場合には工夫が必要になると思います.
公式ドキュメント,よく見ておくのが良いですね.