Python 使用pandas通过可变列读取csv文件

Python 使用pandas通过可变列读取csv文件,python,pandas,Python,Pandas,我正在开发一个软件,可以读取csv文件,并为每个列创建一个列表。 在我的程序中,我将使用DataTime在X坐标和S1上绘制这些数据;S2;S3…作为Y坐标 我的csv文件: DateTime;S1;S2;S3 2020-07-16 15:11:34.358231;677.0552427707063;787.6245155900142;543.0755073183745 2020-07-16 15:11:34.360247;535.4790551706492;317.65859520197984

我正在开发一个软件,可以读取csv文件,并为每个列创建一个列表。 在我的程序中,我将使用
DataTime
在X坐标和
S1上绘制这些数据;S2;S3…
作为Y坐标

我的csv文件:

DateTime;S1;S2;S3
2020-07-16 15:11:34.358231;677.0552427707063;787.6245155900142;543.0755073183745
2020-07-16 15:11:34.360247;535.4790551706492;317.65859520197984;218.64223032216418
2020-07-16 15:11:34.362263;451.9436928722545;449.5560971162404;215.33038976545765
2020-07-16 15:11:34.364279;72.31352267938303;251.55939892326035;896.9233907560412
2020-07-16 15:11:34.366295;758.7365312885398;686.7909954314093;303.9852170969752
2020-07-16 15:11:34.368311;593.8244329562257;698.5981983561348;369.11408762777785
2020-07-16 15:11:34.370327;338.56552989499176;469.327619765774;331.0295457896333
2020-07-16 15:11:34.372343;729.3276090259968;690.776181594403;97.6830657885398
2020-07-16 15:11:34.374359;284.58252864976197;569.0028638781417;196.02767689983673
2020-07-16 15:11:34.376375;909.5920826056772;178.28447193362686;240.4015082916274
我想按列读取文件,但此文件可以更改列数,因为信号是变量。例如,我可以有
S1;S2;S3;S4;S5…

所以我想能够独立地阅读我有多少列。
DateTime
列是标准的,所以我可以读一次

这是我的实际代码:

import pandas as pd
from datetime import datetime
from csv import reader

class Read_csv:
    
    def csv_reader(self, file_name):
    
        with open(file_name, 'r') as read_obj:
            csv_reader = reader(read_obj)
            csv_header = next(csv_reader)
            
        df = pd.read_csv(file_name, delimiter = ';')
        self.datetime_array = list(map(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S.%f'), df["DateTime"]))
        
        for i in range((len(csv_header)-1)):
            #TODO:read signals columns
            
我的更新代码:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

class Read_csv:
    
    def csv_reader(self, file_name):
        

        df = pd.read_csv(file_name, delimiter = ';', parse_dates=['DateTime']).set_index('DateTime')
        
        df.plot()
        sns.lineplot(data=df)
        
        plt.savefig("Signals_Chart.png")
这是我的双图例结果:

  • 最好的方法是了解pandas和matplotlib如何集成,以简化数据操作和打印
将熊猫作为pd导入
将numpy导入为测试数据的np#
为测试数据导入字符串#
从datetime导入测试数据的datetime#
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
#plt造型参数
plt.style.use('seaborn')
plt.rcParams['figure.figsize']=(16.0,10.0)
plt.rcParams[“patch.force_edgecolor”]=真
#包含26列和一个日期列作为索引的测试数据
np.random.seed(365)
cols=list(字符串.ascii_大写)
长度=10
df=pd.DataFrame(np.random.rand(length,26)*1000,columns=cols,index=pd.bdate_range(datetime.today(),freq='d',periods=length.tolist())
#使用pandas.DataFrame.plot
df.plot()
plt.图例(bbox_to_anchor=(1.04,0.5),loc=“中间偏左”,borderaxespad=0)

使用seaborn
sns.lineplot(数据=df,破折号=False)
plt.图例(bbox_to_anchor=(1.04,0.5),loc=“中间偏左”,borderaxespad=0)

将样本数据保存在名为
test.csv的文件中
#在文件中读取
df=pd.read_csv('test.csv',delimiter=';',parse_dates=['DateTime'])。set_index('DateTime'))
#打印文件
sns.线形图(数据=df)

  • 最好的方法是了解pandas和matplotlib如何集成,以简化数据操作和打印
将熊猫作为pd导入
将numpy导入为测试数据的np#
为测试数据导入字符串#
从datetime导入测试数据的datetime#
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
#plt造型参数
plt.style.use('seaborn')
plt.rcParams['figure.figsize']=(16.0,10.0)
plt.rcParams[“patch.force_edgecolor”]=真
#包含26列和一个日期列作为索引的测试数据
np.random.seed(365)
cols=list(字符串.ascii_大写)
长度=10
df=pd.DataFrame(np.random.rand(length,26)*1000,columns=cols,index=pd.bdate_range(datetime.today(),freq='d',periods=length.tolist())
#使用pandas.DataFrame.plot
df.plot()
plt.图例(bbox_to_anchor=(1.04,0.5),loc=“中间偏左”,borderaxespad=0)

使用seaborn
sns.lineplot(数据=df,破折号=False)
plt.图例(bbox_to_anchor=(1.04,0.5),loc=“中间偏左”,borderaxespad=0)

将样本数据保存在名为
test.csv的文件中
#在文件中读取
df=pd.read_csv('test.csv',delimiter=';',parse_dates=['DateTime'])。set_index('DateTime'))
#打印文件
sns.线形图(数据=df)

为什么不
df=pd.read_csv('test.csv',delimiter=';',parse_dates=['DateTime'])。设置索引('DateTime')
然后
df.plot()
。看起来容易些。不需要所有其他的东西。如果您想让绘图看起来更好,
将seaborn导入为sns
,然后
sns.lineplot(data=df)
而不是
df.plot()
。我这样做是因为我不知道csv文件中有多少列,不管有多少列。将日期格式化为datetime,将其设置为索引,并让绘图api处理其余部分。正如您在我之前的评论中所看到的,我没有指定y轴或x轴。你在过去几天提出的问题一直在处理这个问题。最好先了解pandas和matplotlib如何协同工作以简化绘图。为什么不
df=pd.read\u csv('test.csv',delimiter=';',parse_dates=['DateTime'])。设置索引('DateTime')
,然后
df.plot()
。看起来容易些。不需要所有其他的东西。如果您想让绘图看起来更好,
将seaborn导入为sns
,然后
sns.lineplot(data=df)
而不是
df.plot()
。我这样做是因为我不知道csv文件中有多少列,不管有多少列。将日期格式化为datetime,将其设置为索引,并让绘图api处理其余部分。正如您在我之前的评论中所看到的,我没有指定y轴或x轴。你在过去几天提出的问题一直在处理这个问题。您最好先了解pandas和matplotlib如何协同工作以简化绘图。@MatteoWes为问题和您使用的确切代码添加一个屏幕截图。以我为例,它是否绘制了一个双图例?@MatteoWes如果我绘制图形并添加
plt.savefig('test.png')
我不会得到两个图例。您在什么环境/IDE中编码?@MatteoWes不会同时添加
df.plot
sns.lineplot
。选择一个。目前,您正在同一个图形上绘制两个绘图,这就是为什么图例上会出现双值。@MatteoWes,这是因为所有数据都发生在10秒内。正如您在我的示例图中所看到的,轴格式会根据timeseries数据的长度进行调整。还有其他问题和文档涉及指定x轴的精确格式,这是一个不同的问题。@MatteoWes现在是凌晨1:50。“我要睡觉了!”MatteoWes在问题和您使用的确切代码中添加一个屏幕截图。以我为例,它是否绘制了一个双图例?@MatteoWes如果我绘制图形并添加
plt.savefig('test.png')
我不会得到两个图例。您在什么环境/IDE中编码?@MatteoWes不会同时添加
df.plot
an