2017-07-13 4 views
0

フォルダー内の複数のCSVファイルを読み込んでマージしてデータをプロットできるコードを作成しました。すべてのファイルは同じ列とヘッダーを持ちますが、行はさまざまです。ここに私のコードは複数のCSVファイルをマージし、すべてのデータの同じプロットに連続時間をプロットする

import matplotlib.pyplot as plt 
import glob 
import pandas as pd 
import os 

def get_merged_csv(flist, **kwargs): 
    return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True) 

path = 'C:\\Users\C253271\Desktop\FTIR Data\Data Files\\' # define path 
allfiles =glob.glob(os.path.join(path, "*.csv"))  

column_names = ['Relative Time','Peakat2188', 'water'] 
data = get_merged_csv(allfiles, index_col=None) 
data.columns = column_names 

time_in_minutes = pd.to_timedelta(data['Relative Time']).dt.total_seconds()/60 

x=time_in_minutes 
y1=data['Peakat2188'] 
y2=data['water'] 

fig=plt.figure() 

ax1 = fig.add_subplot(111) 

ax1.plot(x,y1,label='Peak at 2188 , color='b') 
ax1.plot(x,y2, label='water', color='r') 

ax1.set_ylabel('Volume Fraction',fontsize=10) 
ax1.set_xlabel('Absolute time (mins)',fontsize=10) 

plt.title('SVC-Evaporator Monitoring', fontsize=20) 
ax1.legend(bbox_to_anchor=(0.8,1.02), loc=3, borderaxespad=0.) 

私のデータは3つのファイルからです。

FTIR Data1.csv 
Relative Time,Peak at 2188 ,water 
00:00:51,0.572157,0.179023 
00:02:51,0.520037,0.171217 
00:04:51,0.551843,0.221285 
00:06:50,0.566279,0.209182 

FTIR Data2.csv 
Relative Time,Peak at 2188 ,water 
00:00:45,0.522157,0.169023 
00:02:31,0.470037,0.161217 
00:04:36,0.501843,0.211285 
00:06:20,0.516279,0.199182 
00:08:45,-0.027304,0.0061351 

FTIR Data3.csv 
Relative Time,Peak at 2188,water 
00:00:51,0.622157,0.199023 
00:02:51,0.570037,0.191217 
00:04:51,0.601843,0.241285 

私は私が行うことができる午前、x軸、上の絶対時間で1つのプロット上のすべてのCSVファイルからデータをプロットしたいです。私は私のデータをマージすると、それはここに見えるが、私は2番目のファイルから始まる前の終了時間にすべての新しい時間を追加したい。 expの場合、行3の時刻は、2番目のファイルの最初の行4に追加したい最初のファイルの最後の時刻です。開始時間は(00:06:50 + 00:00:45 = 00:07:35)とし、次回の5行目(00:07:35 + 00:02:31 = 00:10:06)のようになります。 3つのファイルからのデータを連続してプロットすることです。私はそれが大きな問題ではないはずです。誰かがすぐに私のコードに何かを加えて私を助けることができれば感謝します。おかげで100万

Merged data from 3 files 
     Relative Time Peakat2188  water 
    0  00:00:51  0.572157 0.179023 
    1  00:02:51  0.520037 0.171217 
    2  00:04:51  0.551843 0.221285 
    3  00:06:50  0.566279 0.209182 
    4  00:00:45  0.522157 0.169023 
    5  00:02:31  0.470037 0.161217 
    6  00:04:36  0.501843 0.211285 
    7  00:06:20  0.516279 0.199182 
    8  00:08:45  -0.027304 0.006135 
    9  00:00:51  0.622157 0.199023 
    10  00:02:51  0.570037 0.191217 
    11  00:04:51  0.601843 0.241285 

答えて

0

あなたが探しているのはこれですか?

from pathlib import Path 

def read_csv_files(csv_files): 
    for file in csv_files: 
     df = pd.read_csv(file, index_col=None) 
     df.columns = ['Relative Time','Peakat2188', 'water'] 
     yield df 

def correct_dataframes(dfs): 
    last_time = pd.Timedelta(0) 
    for df in dfs: 
     df['Relative Time'] += last_time 
     last_time = df['Relative Time'].iloc[-1] 
     yield df, last_time 


data_dir = Path(<data_dir>) 
pattern = '*.csv' 

files = data_dir.glob(pattern) 
dfs = read_csv_files(files) 

df_list, end_times = zip(*correct_dataframes(dfs)) 

df = pd.concat(df_list, ignore_index=True) 

DF

Relative Time Peakat2188 water 
0 00:00:51 0.572157 0.179023 
1 00:02:51 0.520037 0.171217 
2 00:04:51 0.551843 0.221285 
3 00:06:50 0.566279 0.209182 
4 00:07:35 0.522157 0.169023 
5 00:09:21 0.470037 0.161217 
6 00:11:26 0.501843 0.211285 
7 00:13:10 0.516279 0.199182 
8 00:15:35 -0.027304 0.006135 
9 00:16:26 0.622157 0.199023 
10 00:18:26 0.570037 0.191217 
11 00:20:26 0.601843 0.241285 

end_times

((Timedelta('0 days 00:06:50'), 
    Timedelta('0 days 00:15:35'), 
    Timedelta('0 days 00:20:26')) 
+0

おかげ@Maartenファーブル。はい、これは私が探しているものです。しかし、最初に、各csvファイルから相対時間の3つのデータフレーム(df1、df2、df3)を作成します。この場合、私は3つのファイルしか持っていませんが、n個のファイルがあればどうなりますか?私はn個のファイルから相対時間データフレームを作成したいと思います。あなたがそれを助けることができれば、私はその部分で少しでも苦労しているでしょう、素晴らしいでしょう。 –

+0

申し訳ありません@MaartenFabré、私のコメントで少し修正。相対時間だけでなく、実際にはすべての列を含む各CSVファイルのデータフレーム。 –

+0

私はglobbingを含む編集を掲示しました。これは、データファイルが検出される順序に依存します。私はこれが語彙的にソートされていると仮定します。私はこれが 'data9.csv'と' data10.csv'の間に何を与えるのか分かりません。 –

関連する問題