class Window_test(QtWidgets.QMainWindow): def __init__(self): super(Window_test, self).__init__() uic.loadUi("version_1.ui", self) self.condition_combox.addItems(["step", "range", ">", "="]) self.condition_combox.setItemText(0, "step") self.condition_combox.activated[str].connect(self.condition_select) # 当改变筛选方式时,调用condition_select函数 self.file_open_button.clicked.connect(self.openfiles) # 打开mdf self.lower_range.setText("0") self.upper_range.setText("0") # self.export_csv_button.clicked.connect(self.delete_all_signals) self.export_csv_button.clicked.connect(self.to_csv) # 导出到csv self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(self.select_signal) # 双击选要导出的信号 self.all_signals.addItem("hello") self.selected_sig = set() # 导出的信号,不可重复选 self.selected_signals.itemDoubleClicked.connect(self.deselect_signal) # 双击删除导出的信号 self.add_condition_combox.addItem("") self.add_condition_combox.setItemText(0, "信号") # 等价于 self.add_condition_combox.addItem("信号") self.show() # 显示窗口 def openfiles(self): # 打开单个mdf文件 self.all_signals.clear() # 先清除上一个文件的信号 filename, filetype = QtWidgets.QFileDialog.getOpenFileName() if filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]: QtWidgets.QMessageBox.about(self, "Message", "文件类型错误") return # 把信号显示在左边框中 self.mdf_file = MDF(filename, memory="minimum") channel_list = list(self.mdf_file.channels_db.keys()) channel_list.remove("time") channel_list.sort() self.add_condition_combox.addItems(channel_list) self.all_signals.addItems(channel_list) # 打开多个mdf文件 # filenames, filetype= QtWidgets.QFileDialog.getOpenFileNames() # for filename in filenames: # file = MDF(filename, memory="minimum") # channel_list = list(file.channels_db.keys()) # channel_list.remove("time") # 多个文件时间可能不同,因此该程序肯定有问题,不管。 # channel_list.sort() # self.data += file.select(channel_list) # for channel in channel_list: # self.all_signals.addItem(channel) # 打开一个文件夹下的所有mdf文件。但具体是否可行未知,或者把上面程序多运行几遍 # dir = os.listdir(QtWidgets.QFileDialog.getExistingDirectory()) # mdf_files = [mdf_file for mdf_file in dir if mdf_file[-3:] in ["dat", "mdf", "DAT", "MDF"]] # mdf = MDF() # mdf.stack(mdf_files, memory='minimum') # signals = mdf.iter_channels() # generator that yields a Signal for each non-master channel # for signal in signals: # self.all_signals.addItem(signal) def select_signal(self, item): # print(item.text()) # QtWidgets.QListWidgetItem.text() # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior. if item.text() not in self.selected_sig: self.selected_signals.addItem(item.text()) self.selected_sig.add(item.text()) def deselect_signal(self): text = self.selected_signals.takeItem(self.selected_signals.currentRow()) self.selected_sig.remove(text.text()) def delete_all_signals(self): self.selected_signals.clear() def condition_select(self, item): if item in ["step", "range"]: self.upper_range.show() self.label_2.show() elif item in [">", "="]: self.upper_range.hide() self.label_2.hide() else: pass def to_csv(self): condition = self.condition_combox.currentText() # 筛选方式 condition_channels = [] # 筛选所用的信号 if condition == "step": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) print("___________") # 得到筛选所用信号的samples值 condition_channels.append(self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select(condition_channels)[0].samples timestamps = self.mdf_file.select(condition_channels)[0].timestamps print("-------------") # start_indexes 和 end_indexes分别是起始和终止索引 start_flag = 0 start_indexes = [] end_flag = 0 end_indexes = [] for i, signal_sample in enumerate(signal_samples): if signal_sample == lower_range and start_flag == 0: start_indexes.append(i) start_flag = 1 if signal_sample == upper_range and start_flag == 1: start_flag = 0 end_flag = 1 if signal_sample != upper_range and end_flag == 1: end_flag = 0 end_indexes.append(i) if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1: end_indexes.append(i+1) # 把所需导出的信号名添加到items中,并从mdf中获得其值,得到selected_signals count = self.selected_signals.count() items = [] data_dict = {"timestamps": []} for i in range(count): items.append(self.selected_signals.item(i).text()) selected_signals = self.mdf_file.select(items) # 将所需信号满足条件的片段筛选出来,加入到data_dict中,并添加时间戳 for idx, signal in enumerate(selected_signals): data_dict[signal.name] = [] for i, j in zip(start_indexes, end_indexes): # data_dict.update({signal.name: signal.samples[i:j]}) try: data_dict[signal.name] += signal.interp(timestamps[i:j]).samples.tolist() if idx == 0: data_dict["timestamps"] += timestamps[i:j].tolist() except: print("error") print(data_dict) # 写入csv self.write_csv(data_dict) elif condition == "range": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) print("___________") condition_channels.append(self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select(condition_channels)[0].samples timestamps = self.mdf_file.select(condition_channels)[0].timestamps print("-------------") start_flag = 0 start_indexes = [] end_indexes = [] for i, signal_sample in enumerate(signal_samples): if upper_range > signal_sample > lower_range and start_flag == 0: start_indexes.append(i) start_flag = 1 if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1: start_flag = 0 end_indexes.append(i) if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1: end_indexes.append(i+1) count = self.selected_signals.count() items = [] data_dict = {"timestamps": []} for i in range(count): items.append(self.selected_signals.item(i).text()) selected_signals = self.mdf_file.select(items) for idx, signal in enumerate(selected_signals): data_dict[signal.name] = [] for i, j in zip(start_indexes, end_indexes): # data_dict.update({signal.name: signal.samples[i:j]}) try: data_dict[signal.name] += signal.interp(timestamps[i:j]).samples.tolist() if idx == 0: data_dict["timestamps"] += timestamps[i:j].tolist() except: print("error") print(data_dict) self.write_csv(data_dict) elif condition == ">": if not self.lower_range.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) condition_channels.append(self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select(condition_channels)[0].samples timestamps = self.mdf_file.select(condition_channels)[0].timestamps print("-------------") start_flag = 0 start_indexes = [] end_indexes = [] for i, signal_sample in enumerate(signal_samples): if signal_sample > lower_range and start_flag == 0: start_indexes.append(i) start_flag = 1 if signal_sample < lower_range and start_flag == 1: start_flag = 0 end_indexes.append(i) if signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1: end_indexes.append(i+1) count = self.selected_signals.count() items = [] data_dict = {"timestamps": []} for i in range(count): items.append(self.selected_signals.item(i).text()) selected_signals = self.mdf_file.select(items) for idx, signal in enumerate(selected_signals): data_dict[signal.name] = [] # signal[i].interp(time).samples for i, j in zip(start_indexes, end_indexes): try: data_dict[signal.name] += signal.interp(timestamps[i:j]).samples.tolist() if idx == 0: data_dict["timestamps"] += timestamps[i:j].tolist() except: print("error") print(data_dict) self.write_csv(data_dict) elif condition == "=": if not self.lower_range.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) condition_channels.append(self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select(condition_channels)[0].samples timestamps = self.mdf_file.select(condition_channels)[0].timestamps print("-------------") start_flag = 0 start_indexes = [] for i, signal_sample in enumerate(signal_samples): if signal_sample == lower_range and start_flag == 0: start_indexes.append(i) start_flag = 1 if signal_sample != lower_range and start_flag == 1: start_flag = 0 count = self.selected_signals.count() items = [] data_dict = {"timestamps": []} for i in range(count): items.append(self.selected_signals.item(i).text()) selected_signals = self.mdf_file.select(items) for idx, signal in enumerate(selected_signals): data_dict[signal.name] = [] for i in start_indexes: # data_dict.update({signal.name: signal.samples[i:j]}) try: print(signal.interp([timestamps[i]]).samples) data_dict[signal.name].append(signal.interp(timestamps[i]).samples) if idx == 0: data_dict["timestamps"].append(timestamps[i]) except: print("error") print(data_dict) self.write_csv(data_dict) else: pass def write_csv(self, data_dict): print("writing to csv..\n") df = pd.DataFrame(data=data_dict) timestamps = df['timestamps'] df.drop(labels=['timestamps'], axis=1, inplace=True) df.insert(0, 'timestamps', timestamps) f_name = str(datetime.now()).split(".")[0].replace(":", "_", 2) + ".csv" f = open(f_name, "w") f.close() df.to_csv(f_name, index=False) print("finished")
import matplotlib # import matplotlib.pyplot as plt # MDF 파일을 읽어옵니다. path = "./" data = MDF(path + "Acceleration_StandingStart.MDF") ### CAN 신호 리스트를 가져 옵니다. signal_list = list(data.channels_db) # 가져온 리스트에서 시간축은 신호가 아니므로 제외합니다. signal_list.remove('t') print(signal_list) # 로깅된 CAN 신호 전체를 볼 수 있습니다. ### 그래프 출력 #speed = data.get('VehicleSpeed') #speed.plot() ### 필요한 신호만 필터링 filtered_signal_list = ['VehicleSpeed', 'Throttle'] ### 여러 그래프 출력 for signal in data.select(filtered_signal_list): signal.plot() # 10초 ~ 12초 사이의 데이터만 필터링 filtered_data = data.filter(filtered_signal_list).cut(start=10, stop=12) ### 엑셀 파일 또는 CSV 파일로 출력 #signals_data_frame = data.to_dataframe() #signals_data_frame.to_excel(path + "signals_data_frame.xlsx") #signals_data_frame.to_csv(path + "signals_data_frame.csv")
class Window_test(QtWidgets.QMainWindow): def __init__(self): super(Window_test, self).__init__() uic.loadUi("version_3.ui", self) self.condition_combox.addItems(["step", "range", ">"]) self.condition_combox.setItemText(0, "step") self.condition_combox_2.addItems(["step", "range", ">"]) self.condition_combox_2.setItemText(0, "step") self.condition_combox.activated[str].connect(self.condition_select) self.condition_combox_2.activated[str].connect(self.condition_select) self.file_open_button.clicked.connect(self.openfiles) self.lower_range.setText("0") self.upper_range.setText("0") self.lower_range_2.setText("0") self.upper_range_2.setText("0") self.export_csv_button.clicked.connect(self.to_csv) self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect(self.select_signal) self.selected_sig = set() # 选中的信号,不可重复选 self.selected_signals.itemDoubleClicked.connect(self.deselect_signal) self.all_signals.addItem("hello") self.add_condition_combox.addItem("") self.add_condition_combox.setItemText(0, "信号") self.add_condition_combox_2.addItem("") self.add_condition_combox_2.setItemText(0, "信号") # 等价于 self.add_condition_combox.addItem("信号") self.add_condition_combox.setMaxVisibleItems(20) self.add_condition_combox_2.setMaxVisibleItems(20) self.checkbox_1.stateChanged.connect(self.check) self.checkbox_2.stateChanged.connect(self.check) self.check_flag_1 = 0 self.check_flag_2 = 0 self.statusBar().showMessage('鲁班7号,智商250') self.save_config.clicked.connect(self.save_configs) self.load_config.clicked.connect(self.load_configs) self.filenames = [] self.completer = QtWidgets.QCompleter() self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) self.add_condition_combox.setCompleter(self.completer) self.add_condition_combox_2.setCompleter(self.completer) # QCompleter::UnfilteredPopupCompletion 1 # All possible completions are displayed in a popup window with the most likely suggestion indicated as current. self.show() def openfiles(self): self.statusBar().showMessage('打开多个文件') self.all_signals.clear() files, filetype = QtWidgets.QFileDialog.getOpenFileNames(self, "选取文件", ".", "MDF Files (*.dat *.mdf *.DAT *.MDF);;All Files (*)") if not files: return for filename in files: if filename[-3:] in ["dat", "mdf", "DAT", "MDF"]: self.filenames.append(filename) filename = self.filenames[0] self.mdf_file = MDF(filename, memory="minimum") # signalnames = list(self.mdf_file.channels_db.keys()) self.all_signals.addItems(signalnames) def check(self, state): # checkbox选中才出现信号选项 source = self.sender() try: self.mdf_file except: if self.checkbox_1.checkState() == 2: # 0 表示未选中, 2表示选中 QtWidgets.QMessageBox.about(self, "Message", "请先打开mdf文件") self.checkbox_1.setCheckState(0) self.checkbox_2.setCheckState(0) return # 每次复选框状态变化,就把flag复位,然后根据信号选择是否置位 if self.check_flag_1 == 1: self.check_flag_1 = 0 if self.check_flag_2 == 1: self.check_flag_2 = 0 if source == self.checkbox_1 and state == QtCore.Qt.Checked: channel_list = list(self.mdf_file.channels_db.keys()) channel_list.remove("time") channel_list.sort() self.add_condition_combox.addItems(channel_list) self.check_flag_1 = 1 if source == self.checkbox_2 and state == QtCore.Qt.Checked: channel_list = list(self.mdf_file.channels_db.keys()) channel_list.remove("time") channel_list.sort() self.add_condition_combox_2.addItems(channel_list) self.check_flag_2 = 1 def select_signal(self, item): # print(item.text()) # QtWidgets.QListWidgetItem.text() # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior. if item.text() not in self.selected_sig: self.selected_signals.addItem(item.text()) self.selected_sig.add(item.text()) def deselect_signal(self): text = self.selected_signals.takeItem(self.selected_signals.currentRow()) self.selected_sig.remove(text.text()) def delete_all_signals(self): self.selected_signals.clear() def condition_select(self, item): source = self.sender() if source == self.condition_combox: if item in ["step", "range"]: self.upper_range.show() self.label_2.show() elif item in [">", "="]: self.upper_range.hide() self.label_2.hide() else: pass if source == self.condition_combox_2: if item in ["step", "range"]: self.upper_range_2.show() self.label_3.show() elif item in [">", "="]: self.upper_range_2.hide() self.label_3.hide() else: pass else: pass def save_configs(self): self.statusBar().showMessage("保存配置") configs = {"selected_signals":[]} # configs = {} if self.checkbox_1.checkState() == 2: configs["checkbox_1"] = True configs["condition_signal"] = self.add_condition_combox.currentText() configs["condition"] = self.condition_combox.currentText() configs["lower_range"] = self.lower_range.text() configs["upper_range"] = self.upper_range.text() if self.checkbox_2.checkState() == 2: configs["checkbox_2"] = True configs["condition_signal_2"] = self.add_condition_combox_2.currentText() configs["condition_2"] = self.condition_combox_2.currentText() configs["lower_range_2"] = self.lower_range_2.text() configs["upper_range_2"] = self.upper_range_2.text() for i in range(self.selected_signals.count()): configs["selected_signals"].append(self.selected_signals.item(i).text()) filename, okpressed = QtWidgets.QInputDialog.getText(self, "保存配置", "请输入文件名:", QtWidgets.QLineEdit.Normal, "") if okpressed and filename.strip(): with open(filename + ".json", "w") as f: json.dump(configs, f) self.statusBar().showMessage("idle") def load_configs(self): self.statusBar().showMessage("导入筛选条件") filename, filetype = QtWidgets.QFileDialog().getOpenFileName(self, "选取文件", ".", "Json Files (*.json);;All Files (*)") if filename: with open(filename, "r") as f: configs = json.load(f) if "checkbox_1" in configs.keys(): self.checkbox_1.setCheckState(2) self.add_condition_combox.setCurrentText(configs["condition_signal"]) self.condition_combox.setCurrentText(configs["condition"]) self.lower_range.setText(configs["lower_range"]) self.upper_range.setText(configs["upper_range"]) if "checkbox_2" in configs.keys(): self.checkbox_2.setCheckState(2) self.add_condition_combox_2.setCurrentText(configs["condition_signal_2"]) self.condition_combox_2.setCurrentText(configs["condition_2"]) self.lower_range_2.setText(configs["lower_range_2"]) self.upper_range_2.setText(configs["upper_range_2"]) self.selected_sig = set(configs["selected_signals"]) self.selected_signals.addItems(list(self.selected_sig)) def to_csv(self): for filename in self.filenames: condition = self.condition_combox.currentText() condition_2 = self.condition_combox_2.currentText() condition_channels = [] condition_channels_2 = [] end_indexes_1 = [] start_indexes_1 = [] end_indexes_2 = [] start_indexes_2 = [] if self.check_flag_1 == 1: if condition == "step": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) condition_channels.append(self.add_condition_combox.currentText()) mdf = MDF(filename, "minimum") signal_samples = mdf.select(condition_channels)[0].samples self.statusBar().showMessage("处理第一个筛选条件") for i in range(len(signal_samples)-1): if signal_samples[i] == lower_range and signal_samples[i+1] == upper_range: start_indexes_1.append(i) end_indexes_1.append(i+1) # for i, signal_sample in enumerate(signal_samples): # if signal_sample == lower_range and start_flag == 0: # start_indexes_1.append(i) # start_flag = 1 # if signal_sample == upper_range and start_flag == 1: # start_flag = 0 # end_flag = 1 # if signal_sample != upper_range and end_flag == 1: # end_flag = 0 # end_indexes_1.append(i) # if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1: # end_indexes_1.append(i+1) elif condition == "range": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) condition_channels.append(self.add_condition_combox.currentText()) mdf = MDF(filename, "minimum") signal_samples = mdf.select(condition_channels)[0].samples self.statusBar().showMessage("处理第一个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples): if upper_range >= signal_sample >= lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1: start_flag = 0 end_indexes_1.append(i) if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1: end_indexes_1.append(i+1) elif condition == ">": if not self.lower_range.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) condition_channels.append(self.add_condition_combox.currentText()) mdf = MDF(filename, "minimum") signal_samples = mdf.select(condition_channels)[0].samples self.statusBar().showMessage("处理第一个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples): if signal_sample > lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if signal_sample < lower_range and start_flag == 1: start_flag = 0 end_indexes_1.append(i) if signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1: end_indexes_1.append(i + 1) else: pass if self.check_flag_2 == 1: if condition_2 == "step": if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) upper_range_2 = float(self.upper_range_2.text()) condition_channels_2.append(self.add_condition_combox_2.currentText()) mdf = MDF(filename, "minimum") signal_samples_2 = mdf.select(condition_channels_2)[0].samples self.statusBar().showMessage("处理第二个筛选条件") for i in range(len(signal_samples_2)-1): if signal_samples_2[i] == lower_range_2 and signal_samples_2[i+1] == upper_range_2: start_indexes_2.append(i) end_indexes_2.append(i+1) elif condition_2 == "range": if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) upper_range_2 = float(self.upper_range_2.text()) condition_channels_2.append(self.add_condition_combox_2.currentText()) mdf = MDF(filename, "minimum") signal_samples_2 = mdf.select(condition_channels_2)[0].samples self.statusBar().showMessage("处理第二个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if upper_range_2 >= signal_sample >= lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if (signal_sample > upper_range_2 or signal_sample < lower_range_2) and start_flag == 1: start_flag = 0 end_indexes_2.append(i) if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1: end_indexes_2.append(i + 1) elif condition_2 == ">": if not self.lower_range_2.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) condition_channels_2.append(self.add_condition_combox_2.currentText()) mdf = MDF(filename, "minimum") signal_samples_2 = mdf.select(condition_channels_2)[0].samples self.statusBar().showMessage("处理第二个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if signal_sample > lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if signal_sample < lower_range_2 and start_flag == 1: start_flag = 0 end_indexes_2.append(i) if signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1: end_indexes_2.append(i + 1) else: pass if self.check_flag_1 == 1 and self.check_flag_2 == 0: self.statusBar().showMessage("getting selected signal") count = self.selected_signals.count() data_dict = {"timestamps": [], "filename": []} timestamps = self.mdf_file.select(condition_channels)[0].timestamps for i in range(count): signal_name = self.selected_signals.item(i).text() mdf = MDF(filename, "minimum") selected_signal = mdf.select([signal_name]) # mdf的select方法参数必须为list data_dict[self.selected_signals.item(i).text()] = [] for k, j in zip(start_indexes_1, end_indexes_1): try: data_dict[self.selected_signals.item(i).text()] += selected_signal[0].interp(timestamps[k:j]).samples.tolist() except: self.statusBar().showMessage("error") for i, j in zip(start_indexes_1, end_indexes_1): try: data_dict["timestamps"] += timestamps[i:j].tolist() data_dict["filename"].append(filename) except: self.statusBar().showMessage("error") self.write_csv(data_dict) elif self.check_flag_1 == 1 and self.check_flag_2 == 1: # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集 index_1 = set() index_2 = set() for i, j in zip(start_indexes_1, end_indexes_1): for n in range(i, j+1): index_1.add(n) for i, j in zip(start_indexes_2, end_indexes_2): for n in range(i, j+1): index_2.add(n) indexes = index_1 and index_2 # 获取需要导出的信号名 count = self.selected_signals.count() data_dict = {"timestamps": [], "filename":[]} timestamps = self.mdf_file.select(condition_channels)[0].timestamps for i in range(count): signal_name = self.selected_signals.item(i).text() mdf = MDF(filename, "minimum") selected_signal = mdf.select([signal_name]) data_dict[self.selected_signals.item(i).text()] = [] # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值 for k in indexes: try: data_dict[self.selected_signals.item(i).text()].append(selected_signal.interp(timestamps[k]).samples) except: self.statusBar().showMessage("error") for i in indexes: try: data_dict["timestamps"].append(timestamps[i]) data_dict["filename"].append(filename) except: self.statusBar().showMessage("error") self.write_csv(data_dict) else: QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框") return def write_csv(self, data_dict): try: df = pd.DataFrame(data=data_dict) except ValueError: QtWidgets.QMessageBox.about(self, "Message", "某些信号采样值缺失") return timestamps = df['timestamps'] df.drop(labels=['timestamps'], axis=1, inplace=True) df.insert(0, 'timestamps', timestamps) f_name = str(datetime.now()).split(".")[0].replace(":", "_", 2) + ".csv" f = open(f_name, "w") f.close() df.to_csv(f_name, index=False) self.statusBar().showMessage("finished")
def to_csv(self): for filename in self.filenames: condition = self.condition_combox.currentText() condition_2 = self.condition_combox_2.currentText() condition_channels = [] condition_channels_2 = [] end_indexes_1 = [] start_indexes_1 = [] end_indexes_2 = [] start_indexes_2 = [] if self.check_flag_1 == 1: if condition == "step": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) condition_channels.append(self.add_condition_combox.currentText()) mdf = MDF(filename, "minimum") signal_samples = mdf.select(condition_channels)[0].samples self.statusBar().showMessage("处理第一个筛选条件") for i in range(len(signal_samples)-1): if signal_samples[i] == lower_range and signal_samples[i+1] == upper_range: start_indexes_1.append(i) end_indexes_1.append(i+1) # for i, signal_sample in enumerate(signal_samples): # if signal_sample == lower_range and start_flag == 0: # start_indexes_1.append(i) # start_flag = 1 # if signal_sample == upper_range and start_flag == 1: # start_flag = 0 # end_flag = 1 # if signal_sample != upper_range and end_flag == 1: # end_flag = 0 # end_indexes_1.append(i) # if signal_sample == upper_range and start_flag ==1 and i == len(signal_samples)-1: # end_indexes_1.append(i+1) elif condition == "range": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) condition_channels.append(self.add_condition_combox.currentText()) mdf = MDF(filename, "minimum") signal_samples = mdf.select(condition_channels)[0].samples self.statusBar().showMessage("处理第一个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples): if upper_range >= signal_sample >= lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1: start_flag = 0 end_indexes_1.append(i) if upper_range > signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1: end_indexes_1.append(i+1) elif condition == ">": if not self.lower_range.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) condition_channels.append(self.add_condition_combox.currentText()) mdf = MDF(filename, "minimum") signal_samples = mdf.select(condition_channels)[0].samples self.statusBar().showMessage("处理第一个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples): if signal_sample > lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if signal_sample < lower_range and start_flag == 1: start_flag = 0 end_indexes_1.append(i) if signal_sample > lower_range and start_flag == 1 and i == len(signal_samples) - 1: end_indexes_1.append(i + 1) else: pass if self.check_flag_2 == 1: if condition_2 == "step": if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) upper_range_2 = float(self.upper_range_2.text()) condition_channels_2.append(self.add_condition_combox_2.currentText()) mdf = MDF(filename, "minimum") signal_samples_2 = mdf.select(condition_channels_2)[0].samples self.statusBar().showMessage("处理第二个筛选条件") for i in range(len(signal_samples_2)-1): if signal_samples_2[i] == lower_range_2 and signal_samples_2[i+1] == upper_range_2: start_indexes_2.append(i) end_indexes_2.append(i+1) elif condition_2 == "range": if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) upper_range_2 = float(self.upper_range_2.text()) condition_channels_2.append(self.add_condition_combox_2.currentText()) mdf = MDF(filename, "minimum") signal_samples_2 = mdf.select(condition_channels_2)[0].samples self.statusBar().showMessage("处理第二个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if upper_range_2 >= signal_sample >= lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if (signal_sample > upper_range_2 or signal_sample < lower_range_2) and start_flag == 1: start_flag = 0 end_indexes_2.append(i) if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1: end_indexes_2.append(i + 1) elif condition_2 == ">": if not self.lower_range_2.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) condition_channels_2.append(self.add_condition_combox_2.currentText()) mdf = MDF(filename, "minimum") signal_samples_2 = mdf.select(condition_channels_2)[0].samples self.statusBar().showMessage("处理第二个筛选条件") start_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if signal_sample > lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if signal_sample < lower_range_2 and start_flag == 1: start_flag = 0 end_indexes_2.append(i) if signal_sample > lower_range_2 and start_flag == 1 and i == len(signal_samples_2) - 1: end_indexes_2.append(i + 1) else: pass if self.check_flag_1 == 1 and self.check_flag_2 == 0: self.statusBar().showMessage("getting selected signal") count = self.selected_signals.count() data_dict = {"timestamps": [], "filename": []} timestamps = self.mdf_file.select(condition_channels)[0].timestamps for i in range(count): signal_name = self.selected_signals.item(i).text() mdf = MDF(filename, "minimum") selected_signal = mdf.select([signal_name]) # mdf的select方法参数必须为list data_dict[self.selected_signals.item(i).text()] = [] for k, j in zip(start_indexes_1, end_indexes_1): try: data_dict[self.selected_signals.item(i).text()] += selected_signal[0].interp(timestamps[k:j]).samples.tolist() except: self.statusBar().showMessage("error") for i, j in zip(start_indexes_1, end_indexes_1): try: data_dict["timestamps"] += timestamps[i:j].tolist() data_dict["filename"].append(filename) except: self.statusBar().showMessage("error") self.write_csv(data_dict) elif self.check_flag_1 == 1 and self.check_flag_2 == 1: # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集 index_1 = set() index_2 = set() for i, j in zip(start_indexes_1, end_indexes_1): for n in range(i, j+1): index_1.add(n) for i, j in zip(start_indexes_2, end_indexes_2): for n in range(i, j+1): index_2.add(n) indexes = index_1 and index_2 # 获取需要导出的信号名 count = self.selected_signals.count() data_dict = {"timestamps": [], "filename":[]} timestamps = self.mdf_file.select(condition_channels)[0].timestamps for i in range(count): signal_name = self.selected_signals.item(i).text() mdf = MDF(filename, "minimum") selected_signal = mdf.select([signal_name]) data_dict[self.selected_signals.item(i).text()] = [] # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值 for k in indexes: try: data_dict[self.selected_signals.item(i).text()].append(selected_signal.interp(timestamps[k]).samples) except: self.statusBar().showMessage("error") for i in indexes: try: data_dict["timestamps"].append(timestamps[i]) data_dict["filename"].append(filename) except: self.statusBar().showMessage("error") self.write_csv(data_dict) else: QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框") return
class Ui_Form(QtWidgets.QWidget): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(599, 468) self.file_open_button = QtWidgets.QPushButton(Form) self.file_open_button.setGeometry(QtCore.QRect(60, 20, 75, 23)) self.file_open_button.setObjectName("file_open_button") self.file_open_button.clicked.connect(self.openfiles) self.condition_combox = QtWidgets.QComboBox(Form) self.condition_combox.setGeometry(QtCore.QRect(290, 70, 70, 20)) self.condition_combox.setObjectName("condition_combox") self.condition_combox.addItems(["step", "range", ">", "="]) self.condition_combox.activated[str].connect(self.condition_select) self.lower_range = QtWidgets.QLineEdit(Form) self.lower_range.setGeometry(QtCore.QRect(372, 70, 61, 20)) self.lower_range.setObjectName("lower_range") self.lower_range.setText("0") self.upper_range = QtWidgets.QLineEdit(Form) self.upper_range.setGeometry(QtCore.QRect(460, 70, 61, 20)) self.upper_range.setObjectName("upper_range") self.upper_range.setText("0") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(440, 70, 16, 16)) self.label_2.setObjectName("label_2") self.add_condition_combox = QtWidgets.QComboBox(Form) self.add_condition_combox.setGeometry(QtCore.QRect(50, 70, 200, 23)) self.add_condition_combox.setObjectName("add_condition_combox") self.add_condition_combox.addItem("") self.export_csv_button = QtWidgets.QPushButton(Form) self.export_csv_button.setGeometry(QtCore.QRect(270, 410, 75, 23)) self.export_csv_button.setObjectName("export_csv_button") # self.export_csv_button.clicked.connect(self.delete_all_signals) self.export_csv_button.clicked.connect(self.to_csv) self.all_signals = QtWidgets.QListWidget(Form) self.all_signals.setGeometry(QtCore.QRect(10, 150, 256, 192)) self.all_signals.setObjectName("all_signals") self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect( self.select_signal) self.selected_sig = set() # 选中的信号,不可重复选 self.selected_signals = QtWidgets.QListWidget(Form) self.selected_signals.setGeometry(QtCore.QRect(320, 150, 256, 192)) self.selected_signals.setObjectName("selected_signals") self.selected_signals.itemDoubleClicked.connect(self.deselect_signal) self.all_signals.addItem("hello") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.file_open_button.setText(_translate("Form", "打开MDF")) # self.condition_combox.setItemText(0, _translate("Form", "step")) self.add_condition_combox.setItemText(0, _translate("Form", "信号")) self.label_2.setText(_translate("Form", "-")) self.export_csv_button.setText(_translate("Form", "导出csv")) def openfiles(self): # 打开单个mdf文件 self.all_signals.clear() filename, filetype = QtWidgets.QFileDialog.getOpenFileName() if filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]: QtWidgets.QMessageBox.about(self, "Message", "文件类型错误") return self.mdf_file = MDF(filename, memory="minimum") channel_list = list(self.mdf_file.channels_db.keys()) channel_list.remove("time") channel_list.sort() self.add_condition_combox.addItems(channel_list) self.all_signals.addItems(channel_list) # 打开多个mdf文件 # filenames, filetype= QtWidgets.QFileDialog.getOpenFileNames() # for filename in filenames: # file = MDF(filename, memory="minimum") # channel_list = list(file.channels_db.keys()) # channel_list.remove("time") # 多个文件时间可能不同,因此该程序肯定有问题,不管。 # channel_list.sort() # self.data += file.select(channel_list) # for channel in channel_list: # self.all_signals.addItem(channel) # 打开一个文件夹下的所有mdf文件。但具体是否可行未知,或者把上面程序多运行几遍 # dir = os.listdir(QtWidgets.QFileDialog.getExistingDirectory()) # mdf_files = [mdf_file for mdf_file in dir if mdf_file[-3:] in ["dat", "mdf", "DAT", "MDF"]] # mdf = MDF() # mdf.stack(mdf_files, memory='minimum') # signals = mdf.iter_channels() # generator that yields a Signal for each non-master channel # for signal in signals: # self.all_signals.addItem(signal) def select_signal(self, item): # print(item.text()) # QtWidgets.QListWidgetItem.text() # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior. if item.text() not in self.selected_sig: self.selected_signals.addItem(item.text()) self.selected_sig.add(item.text()) def deselect_signal(self): self.selected_signals.takeItem(self.selected_signals.currentRow()) def delete_all_signals(self): self.selected_signals.clear() def condition_select(self, item): if item in ["step", "range"]: self.upper_range.show() self.label_2.show() elif item in [">", "="]: self.upper_range.hide() self.label_2.hide() else: pass def to_csv(self): condition = self.condition_combox.currentText() channels = [] # 条件信号 if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围错误") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) if condition == "step": signal_samples = self.mdf_file.select( self.add_condition_combox.currentText()).samples signal_time = self.mdf_file.select( self.add_condition_combox.currentText()).time print(signal_samples) print(signal_time) elif condition == "range": print(self.lower_range.text()) print(self.upper_range.text()) elif condition == ">": print(">") start_time = [] channels.append(self.add_condition_combox.currentText()) try: signal_samples = self.mdf_file.select(channels)[0].samples signal_time = self.mdf_file.select(channels)[0].timestamps except: print("信号错误") for i, signal_sample in enumerate(signal_samples): if signal_sample > lower_range: start_time.append(i) elif condition == "=": print("=") else: pass count = self.selected_signals.count() items = [] data_dict = {} for i in range(count): items.append(self.selected_signals.item(i).text()) signals = self.mdf_file.select(items) # 当存在空数据时,会出错 try: for signal in signals: for i in start_time: data_dict.update({signal.name: signal.samples[i]}) print(data_dict) for i in start_time: data_dict.update({"timestamps": signals[0].timestamps[i]}) print(data_dict) df = pd.DataFrame(data=data_dict) print("-" * 20) df.to_csv("11.csv", index=False) except: print("write error")
class Window_test(QtWidgets.QMainWindow): def __init__(self): super(Window_test, self).__init__() uic.loadUi("version_2.ui", self) self.condition_combox.addItems(["step", "range", ">"]) self.condition_combox.setItemText(0, "step") self.condition_combox_2.addItems(["step", "range", ">"]) self.condition_combox_2.setItemText(0, "step") self.condition_combox.activated[str].connect(self.condition_select) self.condition_combox_2.activated[str].connect(self.condition_select) self.file_open_button.clicked.connect(self.openfiles) self.lower_range.setText("0") self.upper_range.setText("0") self.lower_range_2.setText("0") self.upper_range_2.setText("0") # self.export_csv_button.clicked.connect(self.delete_all_signals) self.export_csv_button.clicked.connect(self.to_csv) self.all_signals.itemDoubleClicked[QtWidgets.QListWidgetItem].connect( self.select_signal) self.selected_sig = set() # 选中的信号,不可重复选 self.selected_signals.itemDoubleClicked.connect(self.deselect_signal) self.all_signals.addItem("hello") self.add_condition_combox.addItem("") self.add_condition_combox.setItemText(0, "信号") self.add_condition_combox_2.addItem("") self.add_condition_combox_2.setItemText(0, "信号") # 等价于 self.add_condition_combox.addItem("信号") self.checkbox_1.stateChanged.connect(self.check) self.checkbox_2.stateChanged.connect(self.check) self.check_flag_1 = 0 self.check_flag_2 = 0 self.show() def openfiles(self): # 打开单个mdf文件 self.all_signals.clear() filename, filetype = QtWidgets.QFileDialog.getOpenFileName() if filename == "": return elif filename[-3:] not in ["dat", "mdf", "DAT", "MDF"]: QtWidgets.QMessageBox.about(self, "Message", "文件类型错误") return self.mdf_file = MDF(filename, memory="minimum") channel_list = list(self.mdf_file.channels_db.keys()) channel_list.remove("time") channel_list.sort() self.all_signals.addItems(channel_list) def check(self, state): # checkbox选中才出现信号选项 source = self.sender() try: self.mdf_file except: if self.checkbox_1.checkState() == 2: # 0 表示未选中, 2表示选中 QtWidgets.QMessageBox.about(self, "Message", "请先打开mdf文件") self.checkbox_1.setCheckState(0) self.checkbox_2.setCheckState(0) return channel_list = list(self.mdf_file.channels_db.keys()) channel_list.remove("time") channel_list.sort() if source == self.checkbox_1 and state == QtCore.Qt.Checked: self.add_condition_combox.addItems(channel_list) self.check_flag_1 = 1 if source == self.checkbox_2 and state == QtCore.Qt.Checked: self.add_condition_combox_2.addItems(channel_list) self.check_flag_2 = 1 def select_signal(self, item): # print(item.text()) # QtWidgets.QListWidgetItem.text() # Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior. if item.text() not in self.selected_sig: self.selected_signals.addItem(item.text()) self.selected_sig.add(item.text()) def deselect_signal(self): text = self.selected_signals.takeItem( self.selected_signals.currentRow()) self.selected_sig.remove(text.text()) def delete_all_signals(self): self.selected_signals.clear() def condition_select(self, item): source = self.sender() if source == self.condition_combox: if item in ["step", "range"]: self.upper_range.show() self.label_2.show() elif item in [">", "="]: self.upper_range.hide() self.label_2.hide() else: pass if source == self.condition_combox_2: if item in ["step", "range"]: self.upper_range_2.show() self.label_3.show() elif item in [">", "="]: self.upper_range_2.hide() self.label_3.hide() else: pass else: pass def to_csv(self): condition = self.condition_combox.currentText() condition_2 = self.condition_combox_2.currentText() condition_channels = [] condition_channels_2 = [] end_indexes_1 = [] start_indexes_1 = [] end_indexes_2 = [] start_indexes_2 = [] if self.check_flag_1 == 1: if condition == "step": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) print("___________") condition_channels.append( self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select( condition_channels)[0].samples print("-------------") start_flag = 0 end_flag = 0 for i, signal_sample in enumerate(signal_samples): if signal_sample == lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if signal_sample == upper_range and start_flag == 1: start_flag = 0 end_flag = 1 if signal_sample != upper_range and end_flag == 1: end_flag = 0 end_indexes_1.append(i) if signal_sample == upper_range and start_flag == 1 and i == len( signal_samples) - 1: end_indexes_1.append(i + 1) elif condition == "range": if not (self.lower_range.text().isdigit() and self.upper_range.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) upper_range = float(self.upper_range.text()) print("___________") condition_channels.append( self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select( condition_channels)[0].samples print("-------------") start_flag = 0 for i, signal_sample in enumerate(signal_samples): if upper_range > signal_sample > lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if (signal_sample > upper_range or signal_sample < lower_range) and start_flag == 1: start_flag = 0 end_indexes_1.append(i) if upper_range > signal_sample > lower_range and start_flag == 1 and i == len( signal_samples) - 1: end_indexes_1.append(i + 1) elif condition == ">": if not self.lower_range.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range = float(self.lower_range.text()) condition_channels.append( self.add_condition_combox.currentText()) signal_samples = self.mdf_file.select( condition_channels)[0].samples print("-------------") start_flag = 0 for i, signal_sample in enumerate(signal_samples): if signal_sample > lower_range and start_flag == 0: start_indexes_1.append(i) start_flag = 1 if signal_sample < lower_range and start_flag == 1: start_flag = 0 end_indexes_1.append(i) if signal_sample > lower_range and start_flag == 1 and i == len( signal_samples) - 1: end_indexes_1.append(i + 1) else: pass if self.check_flag_2 == 1: if condition_2 == "step": if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) upper_range_2 = float(self.upper_range_2.text()) print("___________") condition_channels_2.append( self.add_condition_combox_2.currentText()) signal_samples_2 = self.mdf_file.select( condition_channels_2)[0].samples print("-------------") start_flag = 0 end_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if signal_sample == lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if signal_sample == upper_range_2 and start_flag == 1: start_flag = 0 end_flag = 1 if signal_sample != upper_range_2 and end_flag == 1: end_flag = 0 end_indexes_2.append(i) if signal_sample == upper_range_2 and start_flag == 1 and i == len( signal_samples_2) - 1: end_indexes_2.append(i + 1) elif condition_2 == "range": if not (self.lower_range_2.text().isdigit() and self.upper_range_2.text().isdigit()): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) upper_range_2 = float(self.upper_range_2.text()) print("___________") condition_channels_2.append( self.add_condition_combox_2.currentText()) signal_samples_2 = self.mdf_file.select( condition_channels_2)[0].samples print("-------------") start_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if upper_range_2 > signal_sample > lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if (signal_sample > upper_range_2 or signal_sample < lower_range_2) and start_flag == 1: start_flag = 0 end_indexes_2.append(i) if upper_range_2 > signal_sample > lower_range_2 and start_flag == 1 and i == len( signal_samples_2) - 1: end_indexes_2.append(i + 1) elif condition_2 == ">": if not self.lower_range_2.text().isdigit(): QtWidgets.QMessageBox.about(self, "Message", "范围必须是数字") return lower_range_2 = float(self.lower_range_2.text()) condition_channels_2.append( self.add_condition_combox_2.currentText()) signal_samples_2 = self.mdf_file.select( condition_channels_2)[0].samples print("-------------") start_flag = 0 for i, signal_sample in enumerate(signal_samples_2): if signal_sample > lower_range_2 and start_flag == 0: start_indexes_2.append(i) start_flag = 1 if signal_sample < lower_range_2 and start_flag == 1: start_flag = 0 end_indexes_2.append(i) if signal_sample > lower_range_2 and start_flag == 1 and i == len( signal_samples_2) - 1: end_indexes_2.append(i + 1) else: pass print(start_indexes_1, start_indexes_2, sep="\n") print(end_indexes_1, end_indexes_2, sep="\n") if self.check_flag_1 == 1 and self.check_flag_2 == 0: count = self.selected_signals.count() items = [] data_dict = {"timestamps": []} for i in range(count): items.append(self.selected_signals.item(i).text()) selected_signals = self.mdf_file.select(items) timestamps = self.mdf_file.select(condition_channels)[0].timestamps for idx, signal in enumerate(selected_signals): data_dict[signal.name] = [] for i, j in zip(start_indexes_1, end_indexes_1): try: data_dict[signal.name] += signal.interp( timestamps[i:j]).samples.tolist() if idx == 0: data_dict["timestamps"] += timestamps[i:j].tolist() except: print("error") print(data_dict) self.write_csv(data_dict) elif self.check_flag_1 == 1 and self.check_flag_2 == 1: # 先把两个索引扩展开,把中间的数填上,并把它变成集合,最后取两个集合交集 index_1 = set() index_2 = set() for i, j in zip(start_indexes_1, end_indexes_1): for n in range(i, j + 1): index_1.add(n) for i, j in zip(start_indexes_2, end_indexes_2): for n in range(i, j + 1): index_2.add(n) indexes = index_1 and index_2 # 获取需要导出的信号名 count = self.selected_signals.count() items = [] data_dict = {"timestamps": []} for i in range(count): items.append(self.selected_signals.item(i).text()) selected_signals = self.mdf_file.select(items) timestamps = self.mdf_file.select(condition_channels)[0].timestamps # 把相应信号及其采样值做成字典,信号名作为键,采样值的列表作为值 for idx, signal in enumerate(selected_signals): data_dict[signal.name] = [] for i in indexes: # data_dict.update({signal.name: signal.samples[i:j]}) try: data_dict[signal.name].append( signal.interp(timestamps[i]).samples) if idx == 0: data_dict["timestamps"].append(timestamps[i]) except: print("error") print(data_dict) self.write_csv(data_dict) else: QtWidgets.QMessageBox.about(self, "Message", "请按顺序勾选复选框") return def write_csv(self, data_dict): print("writing to csv..\n") df = pd.DataFrame(data=data_dict) timestamps = df['timestamps'] df.drop(labels=['timestamps'], axis=1, inplace=True) df.insert(0, 'timestamps', timestamps) f_name = str(datetime.now()).split(".")[0].replace(":", "_", 2) + ".csv" f = open(f_name, "w") f.close() df.to_csv(f_name, index=False) print("finished")