Pythonで2つのdtを混同してた話
業務上Pythonを使ってデータ処理する機会があるので、自分なりに得た気づきなどを備忘録として残しています。
今回は、同じ「dt」という名前でも以下のように全く異なる2つの役割がある、という内容になります。
datetimeモジュールの省略形
pandasのdtアクセサ
例えば次のようなコードがあったとします。
import pandas as pd
import datetime as dt
today = dt.datetime.today()
print(today)
tomorrow = today + dt.timedelta(days=1)
print(tomorrow)
df = pd.DataFrame({
'date': pd.to_datetime(['2024-10-28', '2023-09-15', '2022-08-10'])
})
df['year'] = df['date'].dt.year
print(df)
私はこの中に存在する全ての「dt」をdatetimeモジュールの省略形だと思っていたんです!(初心者丸出しでとっても恥ずかしい…初心者でもこんなの知ってるよってツッコミも聞こえてきそうですが…)
datetimeモジュールのdtエイリアス
先ほどの例の中で、datetimeモジュールのdtエイリアスが使われているのは以下の部分です。
import datetime as dt
# 現在の日付を取得
today = dt.datetime.today()
print(today)
# 現在の日付から明日の日付を計算
tomorrow = today + dt.timedelta(days=1)
print(tomorrow)
出力結果
import datetime as dt として使われる dt は、Pythonのdatetimeモジュールを省略して書きやすくするためのエイリアスです。datetimeモジュールは、このように1つの日時データを操作するのに適しています。
pandasの.dtアクセサ
そして、pandasの.dtアクセサが使われているのは以下の部分です。
import pandas as pd
# DataFrameを作成
df = pd.DataFrame({
'date': pd.to_datetime(['2024-10-28', '2023-09-15', '2022-08-10'])
})
# dtアクセサを使って年を取得
df['year'] = df['date'].dt.year
print(df)
出力結果
pandasの .dtアクセサ は pandasのSeriesオブジェクト(DataFrameの1列のデータ)に対して、日時関連の一括操作を行うためのインターフェースです。つまり、アクセサ(=Accessor)はプロパティやメソッドにアクセスするための窓口のことを指すんですね。
.dtアクセサの特徴をまとめておきます。
各要素が日時(datetime64)データのSeriesオブジェクトに対してのみ利用可能
年 / 月 / 日 / 曜日 / 時間差の抽出やフォーマット変更など、日時データを扱うメソッドが提供されている
datetimeモジュールとdtアクセサの違い
このように、両者は全く別物だということがわかりました。
最後に改めて両者の違いをまとめておきます。
datetimeモジュール:1つの日時データを操作するのに適している
pandasのdtアクセサ:Series型の「日時データの列」に対する一括操作に使用
このように混同していた原因は、チームの先輩が書いたコードを理解した "つもり" でいたことです(反省)。一から自分で書いてみる、既存のコードを参照して使うにしても細かいところまで理解しておくのを心掛けないとですね。
次は、ようやく存在を認知できたdtアクセサの使い方や機能について整理してみようかなと思います。
参考資料
※ この記事の一部は、ChatGPTを活用して調査した情報をもとに作成しています。ただし、掲載したコードはGoogle Colab上で実行し、出力結果を確認した上で掲載しています。読者の皆さまが再現できるよう、正確な情報提供に努めています。内容についてご指摘やお気づきの点がございましたら、ぜひコメントいただけると幸いです。