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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9777questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 676

Higomon

score 16

 前提・実現したいこと

  • 最終目標
    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"

 該当のソースコード

#列数が異なるデータの取込
#[方針]
# step1: python標準 csv moduleで読込
# step2: Pandas, DataFrameに変換

import csv
import pandas as pd

#圧力データの取込 ======
path = 'C:\\'
file = 'data.CSV'
fPath = path+file

#列数がバラバラでも対応可能
def Read_CSVs(fPath):    
    f = open(fPath,'rt')
    reader = csv.reader(f)

    list_2D = [] #二次元配列(listのlist)
    for r in reader:
        list_2D.append(r)
    f.close()    
    return list_2D

# listのDATEとTIMEを結合 ==
def Union_DateTime(csv):
    list_2D = []
    for v in csv:
        v[0]=str(v[0] + " " +  v[1]) #<---- DATEとTIMEを結合
        del v[1]
        list_2D.append(v)
    return list_2D

#headerサイズと読込データ列数をfit =====
def Fit_Header(head, csv):
    ColSize = Count_HeaderSize(csv)
    if len(head) < ColSize:
        a=len(head)
        for i in range(0, ColSize - len(head)):        
            head.append('D' + str(a - 1 + i))

def Count_HeaderSize(arr):
    l_size = [len(v) for v in csv_list]
    maxcol = max(l_size)
    return maxcol

# step1: python標準 csv moduleで読込
csv_list = []
csv_list = Union_DateTime(Read_CSVs(fPath))

# Headerの読込
head = csv_list[0] 
del csv_list[0]
Fit_Header(head, csv_list)

# step2: Pandas, DataFrameに変換
df = pd.DataFrame(csv_list,columns= head, dtype=float)

#cast
df['DATE TIME'] = pd.to_datetime(df['DATE TIME'], format='%Y-%m-%d %H:%M:%S')

# Graph表示
fig = plt.figure(figsize=(12, 4))

ax1 = fig.add_subplot(111)
df.plot(x=df['DATE TIME'])
plt.plot(df['D0'])
plt.ylabel('P')

plt.xlabel('Time')

plt.plot()

 試したこと

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

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

def Union_DateTime(csv):
    list_2D = []
    for v in csv:
        v[0]=str(v[0] + " " +  v[1]) #<---- DATETIMEを結合
        del v[1]
        list_2D.append(v)

#中略 

df = pd.DataFrame(csv_list,columns= head, dtype=float)

#cast
df['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 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

環境

  • 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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

(1) matplotlibのAPIを使う1

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


(2) matplotlibのAPIを使う2

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


(3) DataFrameのAPIをを使う

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/18 11:33

    ご回答ありがとうございます。

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

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9777questions

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