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

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

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

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

Q&A

解決済

1回答

3043閲覧

癖のあるCSV[列数可変]のDataFrameへ取込み --> Matplotlibで表示

Higomon

総合スコア33

Python 3.x

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

0グッド

1クリップ

投稿2018/10/17 12:14

編集2018/10/17 23:30

前提・実現したいこと

  • 最終目標
    Python, Pandasで時系列解析

  • 実現したいこと

    1. 列数可変のCSVファイルからDataFrameへ取込み <--現状よりエレガントな方法はありますか?

  2) Matplotlibで表示 <--問題箇所
3) (未実装) 同一時刻の行方向データを列方向に並べ直し、
ミリ秒のタイムスタンプを付与したい
※全列、同じ意味の時系列データで、ファイル容量圧縮のため、同一時刻は横に並んでる

  • 課  題

 MatPlotLibで時系列データを表示出来ない

質問者背景
・Python初学者
・開発経験 Excel VBAのみ

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

"['2016-09-06T14:15:12.000000000' '2016-09-06T14:15:13.000000000'\n '2016-09-06T14:15:14.000000000'] not in index"

該当のソースコード

Python3

1#列数が異なるデータの取込 2#[方針] 3# step1: python標準 csv moduleで読込 4# step2: Pandas, DataFrameに変換 5 6import csv 7import pandas as pd 8 9#圧力データの取込 ====== 10path = 'C:\' 11file = 'data.CSV' 12fPath = path+file 13 14#列数がバラバラでも対応可能 15def Read_CSVs(fPath): 16 f = open(fPath,'rt') 17 reader = csv.reader(f) 18 19 list_2D = [] #二次元配列(listのlist) 20 for r in reader: 21 list_2D.append(r) 22 f.close() 23 return list_2D 24 25# listのDATEとTIMEを結合 == 26def Union_DateTime(csv): 27 list_2D = [] 28 for v in csv: 29 v[0]=str(v[0] + " " + v[1]) #<---- DATEとTIMEを結合 30 del v[1] 31 list_2D.append(v) 32 return list_2D 33 34#headerサイズと読込データ列数をfit ===== 35def Fit_Header(head, csv): 36 ColSize = Count_HeaderSize(csv) 37 if len(head) < ColSize: 38 a=len(head) 39 for i in range(0, ColSize - len(head)): 40 head.append('D' + str(a - 1 + i)) 41 42def Count_HeaderSize(arr): 43 l_size = [len(v) for v in csv_list] 44 maxcol = max(l_size) 45 return maxcol 46 47# step1: python標準 csv moduleで読込 48csv_list = [] 49csv_list = Union_DateTime(Read_CSVs(fPath)) 50 51# Headerの読込 52head = csv_list[0] 53del csv_list[0] 54Fit_Header(head, csv_list) 55 56# step2: Pandas, DataFrameに変換 57df = pd.DataFrame(csv_list,columns= head, dtype=float) 58 59#cast 60df['DATE TIME'] = pd.to_datetime(df['DATE TIME'], format='%Y-%m-%d %H:%M:%S') 61 62# Graph表示 63fig = plt.figure(figsize=(12, 4)) 64 65ax1 = fig.add_subplot(111) 66df.plot(x=df['DATE TIME']) 67plt.plot(df['D0']) 68plt.ylabel('P') 69 70plt.xlabel('Time') 71 72plt.plot()

試したこと

関数Union_DateTime()でCSVから生成した2次元リスト内のDATEとTIMEを結合し
その後、DataFrameに変換しました。

変換後、df.dtypeをみると、df['DATE TIME']はobjectのため、
pd.to_datetime()でdatetime型に変換しました。
↑ここがおかしい???

Python3

1def Union_DateTime(csv): 2 list_2D = [] 3 for v in csv: 4 v[0]=str(v[0] + " " + v[1]) #<---- DATEとTIMEを結合 5 del v[1] 6 list_2D.append(v) 7 8#中略 9 10df = pd.DataFrame(csv_list,columns= head, dtype=float) 11 12#cast 13df['DATE TIME'] = pd.to_datetime(df['DATE TIME'], format='%Y-%m-%d %H:%M:%S')

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

CSV file(列数 可変)


CSVに'D3'列は数値はあるも、'D3'という表記はない(←このサイトに表示させるため記載)
|DATE|TIME|D0|D1|D2|D3|
|:--|:--:|--:|--:|--:|
2016/9/6|14:15:12|970.11|970.11|970.11|
2016/9/6|14:15:13|970.01|970.11|970.11|970.06|
2016/9/6|14:15:14|970.14|970.1|970.1|

(現状) DataFrame


DATE TIMED0D1D2D3
2016/9/6 14:15:12970.11970.11970.11
2016/9/6 14:15:13970.01970.11970.11970.06
2016/9/6 14:15:14970.14970.1970.1

環境

  • Windows 7
  • Anaconda custom (64-bit)| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]
  • Python: 3.6.6, Pandas: 0.23.4
  • Jupyter Notebook

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因は単にグラフの表示処理の問題です
DataFrameからグラフを表示するには

  • matplotlib に DataFrameのデータを渡す。
  • DataFrameplot() を使う

の二つの方法があり、さらに matplotlib を使う方法には幾つかの流派があります
質問のコードを元に具体例をあげますと

(1) matplotlibのAPIを使う1

Python

1plt.figure(figsize=(12, 4)) 2plt.plot(df['DATE TIME'], df['D0']) 3plt.ylabel('P') 4plt.xlabel('Time')

(2) matplotlibのAPIを使う2

Python

1fig = plt.figure(figsize=(12, 4)) 2ax1 = fig.add_subplot(111) 3ax1.plot(df['DATE TIME'], df['D0']) 4ax1.set_ylabel('P') 5ax1.set_xlabel('Time')

(3) DataFrameのAPIをを使う

Python

1ax = df.plot(x='DATE TIME', y='D0',figsize=(4, 4)) 2ax.set_ylabel('P') 3ax.set_xlabel('Time')

matplotlibを使う場合、plot() には列データを渡しますが、 DataFrame.plot() の場合は Label名を渡すことに注意してください

多分Webから様々な情報を取得したのかと思いますが、質問のコードは上記の記述がゴチャゴチャに混ざっている印象を受けます。
一旦どの方法でグラフを作成するのかを整理するとよいのではないでしょうか。

投稿2018/10/18 02:21

magichan

総合スコア15898

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

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

Higomon

2018/10/18 02:33

ご回答ありがとうございます。 非常に明快なご回答で、初心者の私にはよく理解でしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問