import datetime, time, sys import numpy as np import pyqtgraph as pg from pyqtgraph.Qt import QtWidgets def csv_to_nparray(fileName, ContainDateTime, timeRange): if ContainDateTime == 'True': ContainDateTime = True else: ContainDateTime = False Filter = 0 itemMaxNum = 50 if ContainDateTime: timeRange = timeRange.split(',') if len(timeRange) == 2: Filter = 1 startTime = datetime.datetime.strptime(timeRange[0].strip(),'%Y/%m/%d %H:%M:%S') start_timestamp=time.mktime(startTime.timetuple()) stopTime = datetime.datetime.strptime(timeRange[1].strip(),'%Y/%m/%d %H:%M:%S') stop_timestamp=time.mktime(stopTime.timetuple()) else: Filter = 0 #读取文件 with open(fileName, "r") as f: recordTotalNum = len(f.readlines()) f.seek(0) #读取数据文件中的标题行 itemNames = [] itemNames.append('SampleNO') if ContainDateTime == False: itemNames.append('DateTime') tempStr = f.readline() tempStr = tempStr.replace(' ','') tempStr = tempStr.replace('"','') tempStr = tempStr.replace('\t','') tempStr = tempStr.replace('\n','') temp = tempStr.split(',') for i in range(len(temp)): temp[i] = temp[i].strip() if ContainDateTime == True: temp[0] = 'DateTime' itemNames.extend(temp) # print(itemNames) temp = [item for item in itemNames if len(item)>0] itemNames = temp[0:itemMaxNum] print(f"itemNames:{itemNames}") #读取数据文件中的数据,以浮点数的形式读取 rawData = np.array([]) rawData_list = list(rawData) recordNum = 1 for i in range(1, recordTotalNum-1): record = [] line = f.readline() line = line.replace('"','') line = line.replace('/', ' ') line = line.replace('T', ' ') line = line.replace('Z', '') line = line.replace('\t', '') line = line.replace('\n', '') substrings = line.split(',') if ContainDateTime: substrings[0] = substrings[0].split('.')[0] substrings[0] = substrings[0].replace('-',' ') substrings[0] = substrings[0].replace(':',' ') temp = substrings[0].split() date_str = "" for value in temp: if value == '': temp.remove(value) datetime_str = temp[0]+'-'+temp[1]+'-'+temp[2]+' '+temp[3]+':'+temp[4]+':'+temp[5] if datetime_str == '1970-1-1 1:1:1' or datetime_str == '1970-1-1 1:01:01': datetime_str = temp[0]+'-'+temp[1]+'-'+'2'+' '+temp[3]+':'+temp[4]+':'+temp[5] dt = datetime.datetime.strptime(datetime_str,'%Y-%m-%d %H:%M:%S') timestamp=time.mktime(dt.timetuple()) else: datetime_str = '1971-1-2 1:1:1' dt = datetime.datetime.strptime(datetime_str,'%Y-%m-%d %H:%M:%S') timestamp=time.mktime(dt.timetuple()) record.append(recordNum) record.append(timestamp) if ContainDateTime: for j in range(1, min(substrings.__len__(), itemMaxNum)): try: record.append(float(substrings[j].replace(' ',''))) except: record.append(-1) pass else: for j in range(0, min(substrings.__len__(), itemMaxNum)): try: record.append(float(substrings[j].replace(' ',''))) except: record.append(-1) pass if Filter: if record[1] >= start_timestamp and record[1] <= stop_timestamp: recordNum += 1 rawData_list.append(record) else: recordNum += 1 rawData_list.append(record) print(f"record:{record}") rawData = np.array(rawData_list) return itemNames, rawData if __name__ == '__main__': #解析参数 fileName = sys.argv[1] timeRange = sys.argv[2] ContainDateTime = sys.argv[3] curveNum = int(sys.argv[4]) itemNamesRaw, recordsRaw = csv_to_nparray(fileName, ContainDateTime, timeRange) itemNames = itemNamesRaw records = recordsRaw if ContainDateTime == 'True': DisplayTime = True else: DisplayTime = False if DisplayTime == False: itemNames = np.delete(itemNames, 1, 0) # print(itemNames) itemsNum = itemNames.__len__() # print(itemsNum) if DisplayTime == False: records = np.delete(records, 1, 1) # print(records[:,:]) recordsNum = records.__len__() if(itemsNum%curveNum == 0): rowNum = int(itemsNum/curveNum) else: rowNum = int(itemsNum/curveNum)+1 colors = ['#FFFFFF', '#FF0000', '#FFFF00', '#FF00FF', '#00FF00', '#00FFFF', '#C0FF00', '#FF0080', '#FF7F7F', '#7FFF7F','#FFFFFF'] app = QtWidgets.QApplication([]) axsY=[] axsX=[] vbs=[] vLine=[] # 创建视图 pw = pg.GraphicsView() pw.setWindowTitle(fileName) pw.show() # 创建图形布局 l = pg.GraphicsLayout() # 设置视图中心小部件 为该布局 pw.setCentralWidget(l) label = pg.LabelItem(justify='left') l.addItem(label, row=0, col=0, rowspan=1, colspan=11) labelStyle = {'font-size': '9pt'} for i in range(0, itemsNum-1): axsY.append(pg.AxisItem("left", pen=colors[i%10])) axsY[i].setLabel(itemNames[i+1], color=colors[i%10],**labelStyle) vbs.append(pg.ViewBox()) l.addItem(axsY[i],row = int(i/curveNum)+1, col = i%curveNum, rowspan=1, colspan=1) l.addItem(vbs[i],row = int(i/curveNum)+1, col = 10, rowspan=1, colspan=1) axsY[i].linkToView(vbs[i]) if(i>0): vbs[i].setXLink(vbs[0]) if(i%curveNum == 0): axsX.append(pg.AxisItem("bottom", pen=colors[10])) axsX[int(i/curveNum)].setLabel(itemNames[0], color=colors[10],**labelStyle) l.addItem(axsX[int(i/curveNum)],row = int(i/curveNum)+2, col = 10, rowspan=1, colspan=1) axsX[int(i/curveNum)].linkToView(vbs[0]) tempStr = "" if DisplayTime == True: tempStr += "NO.={SampleNO}, " BiasID = 0 else: tempStr += "NO.={SampleNO}, DateTime={DateTime}, " BiasID = 1 for i in range(1, itemsNum): tempStr += "" tempStr += itemNames[i] tempStr += "={" tempStr += itemNames[i] tempStr += "}, " if(i%10 == 0): tempStr +="
" tempStr += "
" # print(tempStr) for i in range(0, rowNum): vLine.append(pg.InfiniteLine(angle=90, movable=True)) vbs[i*curveNum-1].addItem(vLine[i]) # pI.addItem(vLine) def mouseMoved(evt): global tempStr, itemNamesRaw, recordsRaw, BiasID index = 0 dic = {} pos = evt[0] # if l.sceneBoundingRect().contains(pos): for i in range(0, rowNum): if vbs[i*curveNum-1].sceneBoundingRect().contains(pos): mousePoint = vbs[i*curveNum-1].mapSceneToView(pos) index = int(mousePoint.x()) if index > 0 and index < recordsNum: dic[itemNamesRaw[0]] = index dic[itemNamesRaw[1]] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(recordsRaw[index-1,1])) for k in range(2, itemsNum+BiasID): dic[itemNamesRaw[k]] =recordsRaw[index-1,k] # print(dic) label.setText(tempStr.format(**dic)) for i in range(0, rowNum): vLine[i].setPos(index) proxy = pg.SignalProxy(l.scene().sigMouseMoved, rateLimit=60, slot=mouseMoved) # slot: 插槽:调整大小时更新视图 def updateViews(): # setGeometry设置几何图形 # sceneBoundingRect场景边界矩形 for i in range(0, itemsNum-1): vbs[i].setGeometry(vbs[i].sceneBoundingRect()) # 折线点值 (轴刻度范围自动按最大最小值生成) # 给绘图项的视图框添加折线xy点的值,折线颜色 for i in range(0, itemsNum-1): vbs[i].addItem(pg.PlotCurveItem(records[:,0], records[:,i+1], pen=colors[i%10])) #vbs[i].addItem(pg.ScatterPlotItem(records[:,0], records[:,i+1], pen=colors[i%10], symbolBrush=(255,0,0), symbolPen='w', size=2)) # vbs[0].sigResized.connect(updateViews) for i in range(0, itemsNum-1): vbs[i].enableAutoRange(axis= pg.ViewBox.XYAxes, enable=True) # 调整大小时更新 # 开始时自动调整一次以适应视图 # enableAutoRange 启用自动范围 updateViews() app.exec()