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