要进行数据处理,需要将wincc的生产数据导出,导出之后发现csv文件非常大。查看之后,时间序列和数据列在一个文件格中,分隔符有空格和:因此考虑用pandas导入数据。
导出的数据不能直接应用,还是需要进行预处理。因此对数据进行简单的替换,将所有的空格替换成“;”,另外将不合理的数据进行替换;
导出的数据一般有好几万行,因此需要对数据进行分次读取,读取完毕之后再处理。
代码如下:
import pandas as pd
import chardet
##获取文件编码类型
def get_encoding(file):
# 二进制方式读取,获取字节数据,检测类型
with open(file, 'rb') as f:
return chardet.detect(f.read())['encoding']
encod = get_encoding('E:\Softwarestudy\cdqdata\A_14101_3011.csv')
encod
##'UTF-16' #发现wincc导出的csv文件为utf16型,因此读取数据代码如下:
data=pd.read_csv(r"E:\Softwarestudy\cdqdata\A_14101_3011.csv", header=None, sep=';',index_col=0,encoding='utf16',engine='python',nrows=500)
#读取前500行数据
##[500 rows x 11 columns] #读取结果为500行乘以11列的矩阵,成功将数据分离出来了。
#在读取的时候发现系统默认将第一列作为编码,由于实际第一列为数据,因此修改参数index_col=False
data=pd.read_csv(r"E:\Softwarestudy\cdqdata\A_14101_3011.csv", index_col=False,header=None, sep=';',encoding='utf16',engine='python',nrows=500)
特别注意,在python中,false为常规变量,False为特殊代码0。
首先安装pip install openpyxl
writer = pd.ExcelWriter(‘E:\Softwarestudy\cdqdata\test.xlsx’)
提示错误
ModuleNotFoundError: No module named ‘openpyxl’
因此安装上述模块。安装完毕之后又报错:
OSError: [Errno 22] Invalid argument: ‘E:\Softwarestudy\cdqdata\test.xlsx’
经过分析,认为是我的位置中存在\c等问题,因此我将xlsx文件位置改动一下:
writer = pd.ExcelWriter(‘E:\Softwarestudy\Test.xlsx’)
data.to_excel(writer, ‘page_1’, float_format=’%.5f’)
writer.save()
结果正常。记录一下,作为后续的参考。
今天在写入的时候出现了几个错误,在此记录一下:
写矩阵的函数如下:
for i in range(h):
for j in range(l):
sheet1.write(i+1, j+1, data[i, j])
f.save(path)
import xlwt
save(data,'E:\Softwarestudy\cdqdata')
KeyError: (0, 0) #报错
首先是写矩阵的时候一直出现KeyError: (0, 0),经过查找相关的故障分析,我发现是调用的矩阵没有元素位置。经过反复尝试,最终发现矩阵类型错了:
type(data) # 采用type函数来查矩阵类型,发现矩阵类型为frame型,不正确。
data[1,1] # 测试调用矩阵,发现还是报错
KeyError: (1, 1) #错误信息
data=np.arrar(data) #转换矩阵为array型
data[1,1]
0.108506940305233 #终于不报错了
save(data,'E:\Softwarestudy\cdqdata') #再次输入代码
PermissionError: [Errno 13] #出现的是另外一种错误,经过查找,发现是路径错了
#反复考虑,是需要输入带有文件的路径
#修改命令如下
save(data,r'E:\Softwarestudy\xlwt_test.xls') #加r是防止转义,
read_csv()函数参数收集:
(1)默认header=0——表示csv文件的第一行默认为dataframe数据的行名称, header=none表示不以第一行为列名
(2)index_col=0——表示使用第0列作为dataframe的行索引,当参数index_col=False 时,自动生成行索引0到n
(3)squeeze=True——表示如果文件只包含一列,则返回一个序列。
(4)sep=’; 表示csv的分隔符形式,以tab键分隔的,故sep=‘\t’
(5)names=[time,value];表明列名;
(6)转换dataframe到array型后,index参数丢失;
(7)skiprows=n,跳过第n行
data=pd.read_csv(f1, index_col=0,header=None, sep=';',encoding='utf16',engine='python',nrows=5,usecols=[0,1], parse_dates = True,skiprows=2,names=['time','values']) #跳过前2行
date_index = pd.to_datetime(0) #将index改为时间序列
data=data.resample(rule='1S').sum() #重新采样,时间参数为1S,1T为1分钟,1H为1小时,1D为1天,M为月
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
labels 就是要删除的行列的名字,用列表给定
axis 默认为0,指删除行,因此删除columns时要指定axis=1;
data= data.drop(0, 0) #删除第0行数据
data= data.drop(0, 1) #删除第0列数据
以下内容为转载内容:
—————————————————
1对于一个路径 例如C:\Users\xiaoming\Desktop\aa.txt 这里有个\符号 我们知道这个是转义符,我们再之前要加一个r’‘就可以停止转义 r’C:\Users\xiaoming\Desktop\aa.txt’
2就是函数引用时候 参数不加r‘’ ,而在最后输入的时候再加入r’’
————————————————
版权声明:本文为CSDN博主「妖白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24753293/article/details/78066631