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関数に関して勉強していきます。
ではでは今回はこんな感じで。
コメント