こんにちは、あんにんです。
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
・