LoginSignup
5
8

More than 3 years have passed since last update.

Pythonにおける日付処理まとめ(datetimeとdateutil)

Last updated at Posted at 2020-06-01

こんにちは、あんにんです。
DataCampで「Working with Dates and Times in Python」のコースを受講していたところ、あまりにも馴染みのない日付処理が多く(そもそもpd.to_datetimeくらいしか使ったことなかった私…)、「これはコース終わったらすぐ忘れる!やばい!」と思ったので、備忘録代わりにまとめておきたいと思います。

datetime モジュール

日付や時刻を操作するためのモジュール
・Awareクラス:夏時間やタイムゾーンなどの時間調整に関する情報があるデータ
・Naiveクラス:ないデータ

<基本>
datetime.datetime(datetimeオブジェクト)・・・年月日時分秒(dateオブジェクトとtimeオブジェクトの情報を持っている一つのオブジェクト)

from datetime import datetime
today = datetime(2020, 6, 1, 15, 30, 00)
print(today)

Output: 2020-06-01 15:30:00 

datetimeはPOSIXタイムスタンプの値を変換したいとき(datetime.fromtimestamp)にも使える。

datetime.date(dateオブジェクト)・・・年月日のオブジェクト

from datetime import date
today = date(2020, 6, 1)
print(today)

Output: 2020-06-01

使えるメソッドはdatetimeと被っている(逆?dateオブジェクトで使えるものはdatetimeでも使える??).fromtimestampもそうだし、.isoformatとか。

datetime.timedelta(timedeltaオブジェクト)・・・経過時間や時間差など(Duration)

from datetime import date, timedelta
today = date(2020, 6, 1)
print(today + timedelta(days=7))

Output: 2020-06-08

timedelta()の引数には、days, hours, など色々。負の数でも機能する。

datetime.astimezone(astimezoneオブジェクト)・・・引数に指定されたタイムゾーンを適用する。

from datetime import datetime, timezone
today = datetime(2020, 6, 1, 15, 30, 00)
today = today.astimezone(timezone.utc)
print(today)

Output: 2020-06-01 06:30:00+00:00

dateutil.tz モジュール

dateutilはdatetimeを拡張するパッケージです。
今回はDataCampで学習したタイムゾーン実装に強いtzモジュールのみ。

tz.gettz()・・・引数にあるタイムゾーンのインスタンスを作成。

from dateutil import tz
est = tz.gettz('America/New_York')
print(est)

Output: tzfile('/usr/share/zoneinfo/America/New_York')

単体で使用するといまいちピンとこないけど、大陸と都市名で各地域のタイムゾーンが引っ張ってこれるので、datetime系オブジェクトのtzinfoに入れて使える。

tz.datetime_ambiguous()…あいまいな時刻があるかどうか判断するオブジェクト。
「あいまいな時間(Ambiguous time)」とは、複数のUTCにマップされる時刻のこと。すごくわかりやすい例があったので、こちらのブログを一読のこと。

from dateutil import tz
from datetime import datetime

est = tz.gettz('America/New_York')
first_1am = datetime(2019, 11, 2, 1, 0, 0, tzinfo=est)
tz.datetime_ambiguous(first_1am)

Output: True //のはず。Pythonista3ではAttributeError出てしまった。

tz.enfold()・・・上記で出てきた曖昧な時間を区別するためのオブジェクト。
夏時間の時間を引数に入れると、夏時間終了後の時間で返してくれるらしい。
Documentを見てもいまいちわからなかったので、DataCampでの学習内容から推測。

Pandas で日付型を扱うとき

pd.to_datetimeしか知らなかった私ですが、ほかにも色々ありました。

pandas.DataFrame.tz_localize()・・・naiveなDataFrameやSeriesを指定したタイムゾーンにローカライズする。

pandas.DataFrame.tz_convert()・・・awareなDataFrameやSeriesを指定したタイムゾーンにコンバートする。

終わりに

あまり日付まわりを実装することがなかったので、初めて知ることが多かったです。
tz databaseというのも初めて知りました。
複雑だし、奥が深いのだな…と思いました。ほかの言語のことを知らないので、何とも言えないのですが、逆に言えばPythonでは色々なモジュールがあって、日付って触りやすいのでは?と思いました。

記述がまちがっている場合は、指摘してくださると助かります(^^)

参考ドキュメント

https://dateutil.readthedocs.io/en/stable/tz.html
https://docs.python.org/3/library/datetime.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.tz_localize.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.tz_convert.html

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8