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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

2391閲覧

pythonでデータ加工時のKeyErrorについて

MotonoriIshida

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/01/24 03:24

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Pythonで辞書型のtrace_dtから一部データを抽出しtrace.csvを書き出したいです。
1行目でkeyerror:'position'となってしまい抽出できません。
trace_dt内に'position'があるか、key指定に間違いがなか等入念に確認しましたが、解決できず。
pythonを触るのが初めてなもので、質問させて頂きました。
宜しくお願いします。

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

KeyError Traceback (most recent call last) <ipython-input-89-412e37eaad3a> in <module> ----> 1 positions = [[datetime.datetime.fromtimestamp(data['timestamp'] / 1000), data['position']] for data in trace.get('data')] 2 rows = [[dt.isoformat(), p['lat'], p['lng'], p.get('speed', ''), p.get('heading', '')] for dt, p in positions] 3 rows = [['TIMESTAMP', 'LATITUDE', 'LONGITUDE', 'SPEED_MPS', 'HEADING']] + rows 4 trace_csv = '\n'.join(map(lambda x: ','.join(map(str, x)), rows)) 5 print(trace_csv) <ipython-input-89-412e37eaad3a> in <listcomp>(.0) ----> 1 positions = [[datetime.datetime.fromtimestamp(data['timestamp'] / 1000), data['position']] for data in trace.get('data')] 2 rows = [[dt.isoformat(), p['lat'], p['lng'], p.get('speed', ''), p.get('heading', '')] for dt, p in positions] 3 rows = [['TIMESTAMP', 'LATITUDE', 'LONGITUDE', 'SPEED_MPS', 'HEADING']] + rows 4 trace_csv = '\n'.join(map(lambda x: ','.join(map(str, x)), rows)) 5 print(trace_csv) KeyError: 'position'

該当のソースコード

Python3

1positions = [[datetime.datetime.fromtimestamp(data['timestamp'] / 1000), data['position']] for data in trace.get('data')] 2rows = [[dt.isoformat(), p['lat'], p['lng'], p.get('speed', ''), p.get('heading', '')] for dt, p in positions] 3rows = [['TIMESTAMP', 'LATITUDE', 'LONGITUDE', 'SPEED_MPS', 'HEADING']] + rows 4trace_csv = '\n'.join(map(lambda x: ','.join(map(str, x)), rows)) 5print(trace_csv)

対象データ(trace_dt)

[{'timestamp': 1611050342745, 'position': {'alt': 41, 'lat': 35.32930204, 'lng': 139.48793563, 'type': 'gnss', 'speed': 0, 'accuracy': 11.127232551574707, 'timestamp': 1611050353000, 'altaccuracy': 1}, 'system': {'client': {'name': 'HERE Tracker', 'model': 'Pixel 3a', 'version': '1.1.5', 'firmware': 'RQ1A.210105.002', 'platform': 'android', 'manufacturer': 'Google'}, 'reportedSensorData': {'batteryLevel': 41, 'batteryIsCharging': False}}, 'serverTimestamp': 1611050490457}, {'timestamp': 1611050282678, 'position': {'alt': 53, 'lat': 35.32929445, 'lng': 139.48796048, 'type': 'gnss', 'speed': 0, 'accuracy': 23.525157928466797, 'timestamp': 1611050292000, 'altaccuracy': 1}, 'system': {'client': {'name': 'HERE Tracker', 'model': 'Pixel 3a', 'version': '1.1.5', 'firmware': 'RQ1A.210105.002', 'platform': 'android', 'manufacturer': 'Google'}, 'reportedSensorData': {'batteryLevel': 41, 'batteryIsCharging': False}}, 'serverTimestamp': 1611050490457},

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

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

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

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

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

guest

回答1

0

ベストアンサー

trace_dt内に'position'があるか、key指定に間違いがなか等入念に確認しましたが

どのような確認をされたかわかりませんが、実際にKeyErrorが発生するなら、key指定に間違いがある、という可能性が高いのではないでしょうか。

1行目の

positions = [[datetime.datetime.fromtimestamp(data['timestamp'] / 1000), data['position']] for data in trace.get('data')]

を下記のように書き換えるとKeyErrorが発生するデータのtimestampが表示されるはずですので、その部分をもう一度調べてみてはいかがでしょうか。

positions = [] add_positions = positions.append for data in trace.get('data'): if data.get("position") is None: print("\n### データ[timestamp:{}]から、キーpositionsを見つけることができませんでした。 ###\n".format(data.get("timestamp"))) continue add_positions([datetime.datetime.fromtimestamp(data['timestamp'] / 1000), data['position']]) (以下略)

投稿2021/01/24 03:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MotonoriIshida

2021/01/24 04:22

ありがとうございました。ブランクになっている行があり、エラーが出ていたようです。 try-exceptを入れて解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問