質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

2回答

1371閲覧

pythonで曜日を出力するためのfor文を作成したい。

Ryota0918

総合スコア15

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2020/10/14 14:19

編集2020/10/14 15:00

###エラーが起きているコード

list_dayofweek=[] for i in range(len(analysis_data["datetime"])): dayofweek=analysis_data["datetime"][i].strftime("%A") list_dayofweek.append(dayofweek) list_dayofweek

###修正後でまだエラーが出ているコード

datetime=analysis_data["datetime"] list_dayofweek=[] for i in range(len(datetime)): list_dayofweek.append(datetime[i].strftime("%A")) list_dayofweek

###行いたいこと
analysis_data["datetime"]にはタイムスタンプ型の日付プラス時刻データが入っており、それらの日付を参照して曜日を出力するための繰り返し文を作成したい、

###起きているエラー全文

--------------------------------------------------------------------------- KeyError Traceback (most recent call last) ~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 2645 try: -> 2646 return self._engine.get_loc(key) 2647 except KeyError: pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() KeyError: 1 During handling of the above exception, another exception occurred: KeyError Traceback (most recent call last) <ipython-input-81-e3c29a94a9bc> in <module> 2 list_dayofweek=[] 3 for i in range(len(datetime)): ----> 4 list_dayofweek.append(datetime[i].strftime("%A")) 5 list_dayofweek ~\Anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key) 869 key = com.apply_if_callable(key, self) 870 try: --> 871 result = self.index.get_value(self, key) 872 873 if not is_scalar(result): ~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key) 4386 # try that 4387 try: -> 4388 iloc = self.get_loc(key) 4389 return s[iloc] 4390 except KeyError: ~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 2646 return self._engine.get_loc(key) 2647 except KeyError: -> 2648 return self._engine.get_loc(self._maybe_cast_indexer(key)) 2649 indexer = self.get_indexer([key], method=method, tolerance=tolerance) 2650 if indexer.ndim > 1 or indexer.size > 1: pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() KeyError: 1

というエラーが出て、うまく処理ができません。
Keyerrorは辞書型データを利用している時に出てしまうそうなのですが、今回は辞書型データを使っているつもりがなく、、

解決方法がわかる方、教えていただけますと幸いです。

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

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

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

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

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

takutakuya

2020/10/14 14:25

analysis_dataは辞書なのでしょうか?DataFrameでしょうか? analysis_dataを作成した際のコードがあれば、追加をお願いします。 また、コードを記載する場合は「コードの挿入」(<code>ボタン)を使ってください。
Ryota0918

2020/10/14 14:29

analysis_dataはpd.read_csvで読み込んだものです、 type関数でも確認したところanalysis_dataはデータフレームでした。、pandas.core.frame.DataFrame またコードの挿入を行いました。失礼しました。
takutakuya

2020/10/14 14:30

append()メソッドの中の「dayofweek」は他で定義されているのでしょうか?
Ryota0918

2020/10/14 14:35

再び申し訳ないです。 コードを試しているうちに抜け落ちてしまっていました。 dayofweekをコード内に追記しました。
takutakuya

2020/10/14 15:10

読み込んでいるCSVファイルはどういう形式でしょうか? また、CSVファイルの読み込みから、タイムスタンプ型への変更部分のコードは提示いただけないでしょうか?
guest

回答2

0

ベストアンサー

下記でどうでしょうか?

Python

1import pandas as pd 2 3analysis_data = pd.read_csv('datetime.csv') 4 5analysis_data = pd.to_datetime(analysis_data['datetime']) 6 7list_dayofweek=[] 8 9for i in range(len(analysis_data)): 10 dayofweek = analysis_data[i].strftime("%A") 11 list_dayofweek.append(dayofweek) 12 13print(list_dayofweek)

CSVファイルから日付を読み込むと文字列として読み込まれるので、detetime型に変換しています。

上記コードですが、下記のようなCSVデータで曜日に変換できることは確認しています。

id,datetime 1,'2020-10-14 00:00:00' 2,'2019-10-14 00:00:00' 3,'2018-10-14 00:00:00' 4,'2020-10-13 00:00:00' 5,'2020-10-12 00:00:00' 6,'2020-10-11 23:00:00'

確認結果
日時to曜日の確認結果

エラーになる原因について推測

KeyError:1になる原因について推測してみました。
CSVファイルから日時のデータを読み込んだ後で、日付か何かの条件でデータを抽出していないでしょうか?
例えば、2020年1月1日以降の日付を抽出するなどです。
その場合、データに付与されているインデックス番号が連番ではなくなっています。
KeyError:1と出ているので、インデックス番号が1だったデータが条件抽出などで抜けたのではないかと推測します。

この推測が合っている場合、日付のデータをfor文に入れる前に、インデックス番号を振り直す必要があります。
修正後のコードではfor文に入れているのはdatetimeなので、for文の直前に下記1行を追加してください。

Python

1datetime = datetime.reset_index(drop=True)

投稿2020/10/14 14:41

編集2020/10/14 18:42
takutakuya

総合スコア979

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

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

Ryota0918

2020/10/14 14:46

試してみましたが、同じエラーが出てしまいます。。
takutakuya

2020/10/14 14:48

どこでエラーが出ていますでしょうか? 提示していただいていない箇所のコードが影響している可能性があります。
Ryota0918

2020/10/14 14:58

修正後でまだエラーが出ているコードを追記しました。 csvを読み込んだ時のpd.to_datetimeを用いた文字列→タイムスタンプ型への変更はすでに行っておりましたので、今回は行っていません。
Daregada

2020/10/14 15:30 編集

現在のノートで作業を続けるのではなく、新しいノートを作成して、そこで回答者のコードを実行してみてください。提示したコードの前に何をしていたか、回答者にはわかりません。
takutakuya

2020/10/14 18:22

CSVファイルからデータを読み込んだあと、日付の条件か何かでデータを抽出していませんか?
Ryota0918

2020/10/14 23:27

仰るとおり、drop.naでデータを抽出しています。 reset.indexで無事に曜日を出力することができました。 ありがとうございます!
guest

0

CSVファイルを読む代わりに、変数txtの内容をread_csvで読ませていますが、やっていることは同じです。
このコードを、今作業しているノートではなく、新しいノートを開いてそこで実行してください。

Python

1import pandas as pd 2import io 3 4txt = """ 5datetime,dummydata1 62020-10-15 00:01:02,hogehoge 72020-10-16 03:04:05,bokeboke 82020-10-18 06:07:08,foo 9""" 10 11analysis_data = pd.read_csv(io.StringIO(txt), parse_dates=['datetime']) 12 13 14datetime = analysis_data["datetime"] 15list_dayofweek = [] 16 17for i in range(len(datetime)): 18 list_dayofweek.append(datetime[i].strftime("%A")) 19 20print(list_dayofweek)

result

1['Thursday', 'Friday', 'Sunday']

投稿2020/10/14 15:47

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問