質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

669閲覧

特定の年月のデータを参照できない

Ryuuuki37

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/12/26 18:17

0

0

実現したいこと

pandasでの時系列データの参照において特定の年月を指定したいのですが
書籍の記載済みのコードが正しく作動しません。

アドバイスいただけますと幸いです。

前提

ここでは、サンプルデータに含まれる2001/1/2から2016/12/30までのドル円の為替レートデータ(DEXJPUS)を使います。日ごとのレートデータで、欠損している日(休日など)もあります。

start_date = '2001/1/2'
end_date = '2016/12/30'

fx_jpusdata = pdr.DataReader('DEXJPUS', 'fred', start_date, end_date)

fx_jpusdata.head()

fx_jpusdata["2016-04"]

発生している問題・エラーメッセージ


KeyError Traceback (most recent call last)
File ~/anaconda3/lib/python3.11/site-packages/pandas/core/indexes/base.py:3653, in Index.get_loc(self, key)
3652 try:
-> 3653 return self._engine.get_loc(casted_key)
3654 except KeyError as err:

File ~/anaconda3/lib/python3.11/site-packages/pandas/_libs/index.pyx:147, in pandas._libs.index.IndexEngine.get_loc()

File ~/anaconda3/lib/python3.11/site-packages/pandas/_libs/index.pyx:176, in pandas._libs.index.IndexEngine.get_loc()

File pandas/_libs/hashtable_class_helper.pxi:7080, in pandas._libs.hashtable.PyObjectHashTable.get_item()

File pandas/_libs/hashtable_class_helper.pxi:7088, in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '2016-04'

The above exception was the direct cause of the following exception:

KeyError Traceback (most recent call last)
Cell In[94], line 1
----> 1 fx_jpusdata["2016-04"]

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:3761, in DataFrame.getitem(self, key)
3759 if self.columns.nlevels > 1:
3760 return self._getitem_multilevel(key)
-> 3761 indexer = self.columns.get_loc(key)
3762 if is_integer(indexer):
3763 indexer = [indexer]

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/indexes/base.py:3655, in Index.get_loc(self, key)
3653 return self._engine.get_loc(casted_key)
3654 except KeyError as err:
-> 3655 raise KeyError(key) from err
3656 except TypeError:
3657 # If we have a listlike key, _check_indexing_error will raise
3658 # InvalidIndexError. Otherwise we fall through and re-raise
3659 # the TypeError.
3660 self._check_indexing_error(key)

KeyError: '2016-04'

該当のソースコード

fx_jpusdata["2016-04"]

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/12/26 22:28

> 書籍の記載済みのコードが正しく作動しません。 書籍名は何でしょうか?正誤表は確認済でしょうか?
Ryuuuki37

2023/12/26 22:31

コメントありがとうございます。 東京大学のデータサイエンティスト育成講座(ISBN978-4-8399-6525-9) こちらの参考書になりますが正誤表には一切この件については記載されておりませんでした。
meg_

2023/12/26 22:37

fx_jpusdataのカラム名がどうなっているか確認すると良いかと思います。
TakaiY

2023/12/27 01:13

前の質問でもコメントしましたが、書籍が 2019年発行と古い(この界隈では)ので、モジュールの仕様や元データの仕様などの環境の変化で動かなくなってしまう可能性が高いです。 また、以下のエラーからすると、データに該当カラムが無いようですが、データの中身は確認しましたか。 KeyError Traceback (most recent call last) Cell In[94], line 1 ----> 1 fx_jpusdata["2016-04"] KeyError: '2016-04'
guest

回答2

0

Pandas 1.2.0 で df[date_string] 形式による行の抽出処理は廃止されました。

What's new in 1.2.0 (December 26, 2020) — pandas 2.1.4 documentation

Deprecated indexing DataFrame rows with a single datetime-like string as df[string] (given the ambiguity whether it is indexing the rows or selecting a column), use df.loc[string] instead (GH36179)

なお、GH36179(pull request)は以下になります。

DEPR: string indexing along index for datetimes by jbrockmendel · Pull Request #36179 · pandas-dev/pandas

ちなみに、.loc 以外にも sliceによる抽出が可能です。

python

1>>> fx_jpusdata["2016-04":"2016-04"] 2 DEXJPUS 3DATE 42016-04-01 112.06 52016-04-04 111.18 62016-04-05 110.26 72016-04-06 109.63 82016-04-07 107.98 92016-04-08 108.36 102016-04-11 107.96 112016-04-12 108.54 122016-04-13 109.21 132016-04-14 109.20 142016-04-15 108.76 152016-04-18 108.85 162016-04-19 109.16 172016-04-20 109.51 182016-04-21 109.41 192016-04-22 111.50 202016-04-25 111.08 212016-04-26 111.23 222016-04-27 111.26 232016-04-28 108.55 242016-04-29 106.90

投稿2023/12/27 04:00

編集2023/12/27 04:10
melian

総合スコア21343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

pandasの挙動が変わった可能性があります。
代わりに明示的にlocを使うとよいです。

Python

1import pandas as pd 2from datetime import datetime 3 4dr = pd.date_range('2001-01-01', '2016-12-31') 5df = pd.DataFrame(index=dr, data=list(range(len(dr)))) 6 7#print(df['2016-04']) # KeyError: '2016-04' 8print(df.loc['2016-04'].head()) 9""" 10 0 112016-04-01 5569 122016-04-02 5570 132016-04-03 5571 142016-04-04 5572 152016-04-05 5573 16"""

投稿2023/12/27 01:35

can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問