【Python基礎】datetime:NaT(Not-a-Time)とNumPyとPandasにおけるNaT判定

  • URLをコピーしました!
目次

datetime

前回、datetimeモジュールでのタイムゾーンの設定を解説しました。

今回は同じくdatetime型のお話でNaT(Not-a-Time)に関して色々と試していきます。

Pandaで出てきた欠損値「Nan」の日時バージョンです

要するに時間のデータなんだけど、値がない場合にNaTを使うというわけです。

なかなか日時で欠損値を扱うことがないようで、情報が少なく、扱いに結構苦労したので、自分なりにまとめておこうというのが今回のお話です。

numpyでのNanとNaT

まずNaTを扱う可能性がある一つとしてnumpyの操作が挙げられます。

なぜならnumpyで扱う型の一つに、日時の型であるdatetime64型というのがあるからです。

またNaTを作るためにもnumpyを使うので、同時に紹介していきます。

まずおさらいですが、numpyでNanのデータを作成するのは「np.nan」でした。

そしてNanの判定をするのは「np.isnan(値)」でした。

import numpy as np

np_val = np.nan

print(np_val)
print(np.isnan(np_val))

実行結果
nan
True

ちなみに「np.isnan(値)」は「Nanかどうかを判定」するので「TrueがNan」、「FalseがNanではない」という結果になります。

numpyでNaTを作成するには「np.datetime64(‘nat’)」とします。

またNaTの判定はNanの判定と同じく「np.isnan(値)」を使います。

import numpy as np

dt_val = np.datetime64('nat')

print(dt_val)
print(np.isnan(dt_val))

実行結果
NaT
True

私はずっと「Natを判定する関数」を探していたので、ここでものすごく時間を浪費しました。

PandasでのNaT

次にNaTが出てくる場面はPandasで日時を扱った際です。

ちなみに私がNaTを始めてみたのはこのPandasの操作からです。

まずは日時をデータにもつデータフレームを作成します。

import pandas as pd

df = pd.DataFrame()

df['date'] = ["2022/8/22 21:53:22", None]

print(df)

実行結果
                 date
0  2022/8/22 21:53:22
1                None

1行目のデータは日時が入っており、2行目のデータはNoneになっています。

このデータフレームの「date」の列をdatetime型に変換します。

変換の方法としては「pd.to_datetime(datetime型の列, format=’フォーマット’)」です。

import pandas as pd

df = pd.DataFrame()

df['date'] = ["2022/8/22 21:53:22", None]
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d %H:%M:%S')

print(df)

実行結果
                 date
0 2022-08-22 21:53:22
1                 NaT

これでNaTが出てきました。

データフレームでのNaTの判定:isna()、isnull()

このNaTの判定をデータフレーム全体で判定するには「データフレーム.isna()」、もしくは「データフレーム.isnull()」を使います。

import pandas as pd

df = pd.DataFrame()

df['date'] = ["2022/8/22 21:53:22", None]
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d %H:%M:%S')

print(df.isna())

実行結果
    date
0  False
1   True
import pandas as pd

df = pd.DataFrame()

df['date'] = ["2022/8/22 21:53:22", None]
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d %H:%M:%S')

print(df.isnull())

実行結果
    date
0  False
1   True

データフレームの要素でのNaTの判定:pd.isna()、pd.isnull()

次に実際にはこちらの方がよく使うと思いますが、データフレームの要素におけるNaTの判定です。

要素におけるNaTの判定では「pd.isna(データフレームの要素)」、もしくは「pd.isnull(データフレームの要素)」を用います。

import pandas as pd

df = pd.DataFrame()

df['date'] = ["2022/8/22 21:53:22", None]
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d %H:%M:%S')

for i in range(len(df)):
    print(pd.isna(df['date'].iloc[i]))

実行結果
False
True
import pandas as pd

df = pd.DataFrame()

df['date'] = ["2022/8/22 21:53:22", None]
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d %H:%M:%S')

for i in range(len(df)):
    print(pd.isnull(df['date'].iloc[i]))

実行結果
False
True

NaTで調べたらなかなか情報が出てこなくて結構困りましたが、使ってみたらほぼNanと同じ扱いができました。

とは言ってもNanの扱いをあまりしてこなかったので、この情報に辿り着くまでに結構苦労したので、他の方が時間を浪費しないよう、この情報が参考になりましたら幸いです。

次回はmap関数に関して勉強していきます。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次