前提・実現したいこと
-
最終目標
Python, Pandasで時系列解析 -
実現したいこと
- 列数可変の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 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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/18 02:33