はじめに
pandasのdatetime型を扱ったときにエラーを吐かれ、検索してもほぼ出てこなかったので残しておきます。
問題設定
以下のようなcsvファイルをpandasで読み込み、dateをindexにした後にdateが2020年のものをスライスすることを目的とする。下の表は一例だがデータ収集の際、日付に関して降順にソートされている。
title | date |
---|---|
aa | 2021/4/3 |
bb | 2021/2/1 |
cc | 2020/6/11 |
dd | 2020/2/20 |
今回動かしたコードは以下:
import pandas as pd df = pd.read_csv('./data.csv') df['date'] = pd.to_datetime(df['date']) df.index = df['date'] print(df['2020'])
まずdateが年/月/日となっているのでpandasのdatatime型に変換する。変換すると年-月-日の形となる。このdatatime型をindexに設定するといろいろと楽なのでindexを変更する。日付で範囲指定できたりスライシングができる。 https://qiita.com/sakabe/items/ae1fa47a58c796006627 とりあえず2020年のものを抜き出そうとすると、、、
AssertionError: <class 'numpy.ndarray'>
解決方法
初めに解決方法だけ書く。どうやらdatetime型は昇順にソートされていないとスライスができないようなのでdateに対してソートを行う。すなわちdf = df.sort_index()
を追加することで期待する出力(=2020年のtitle)が得られる。
原因
AssertionErrorはプログラムが設定されたアサーションがFalseとなったときに出るエラー。今回はpandas側でエラーが出ている。エラーログを見るとassert isinstance(slobj, slice), type(slobj)
となっているため本来受け取ってはいけないnumpy配列型がきてしまっている。pandasの中身を見てみるとslice型?スライスオブジェクトを受け取るらしい。それが何故昇順にソートすることでnumpy配列からスライスオブジェクトになるのかはわからない。numpy配列で何を受け取っているのか確認すると元のインデックスを受け取っているようだった。また、(ないとは思ったが)sort_index()で特別な処理がされているのでは?と思い敢えて降順でソートsort_index(ascending=False)として実行してみたが同様のエラーが出た。よって昇順にソートされていることが重要であると考えられる。もし何か知っている方がいたら教えてください…。