Python 合并多个csv文件并在同一绘图上连续绘制所有数据

Python 合并多个csv文件并在同一绘图上连续绘制所有数据,python,csv,pandas,matplotlib,plot,Python,Csv,Pandas,Matplotlib,Plot,我已经创建了一个代码,可以成功地读取和合并文件夹中的多个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], igno

我已经创建了一个代码,可以成功地读取和合并文件夹中的多个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.)
这是我三个文件中的数据

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
我想用xaxis上的绝对时间在一个绘图上绘制所有csv文件中的数据,这是我能够做到的。当我合并我的数据时,这里是它的样子,但我想将每个新时间添加到从第二个文件开始的前一个结束时间中。对于exp,第3行中的时间是我想添加到第4行的第一个文件的最后一次,这是第二个文件的第一次。因此,现在开始时间应该是(00:06:50+00:00:45=00:07:35),然后将此时间添加到同一文件的第5行(00:07:35+00:02:31=00:10:06),依此类推。其思想是将三个文件中的数据绘制为连续数据。我希望这不会是一个大问题,如果有人能在我的代码中快速添加一些东西来帮助我,我将不胜感激。万分感谢

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

你要找的是这样的东西吗

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)
结束时间


谢谢@Maarten Fabré。是的,这正是我要找的。但首先,我如何从每个csv文件创建相对时间的三个数据帧(df1、df2、df3)。在这种情况下,我只有3个文件,但如果我有n个文件呢?我想从n个文件中创建相对时间数据帧。我在这一部分也有点挣扎,如果你也能帮忙的话,那就太好了。抱歉@Maarten Fabré,我的评论有点更正。不仅仅是相对时间,实际上是包含所有列的每个csv文件的数据帧。这取决于找到数据文件的顺序。我想这是按词汇分类的。我不知道这会给
data9.csv
data10.csv
带来什么,还有一件事@Maarten Fabré。。。当我绘制所有这些数据时。。它显示了一个我想要的连续数据,但无论如何,我可以在图上放置拆分或分隔符,指示第一个实验何时完成,第二个实验何时开始,等等。假设第一个csv文件中的数据是实验1,第二个csv文件中的数据是实验2,依此类推。当用户查看图表时,它将非常方便。谢天谢地,againI对该方法进行了调整,以生成
df
last_time
,然后生成一行,以获得序列中的数据。(我没有测试这段代码,所以它会出错,请告诉我)
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
((Timedelta('0 days 00:06:50'),
  Timedelta('0 days 00:15:35'),
  Timedelta('0 days 00:20:26'))