Python脚本二次及后续循环返回空数组问题排查求助
问题分析与解决方案
核心问题
- 切片范围错误:
self.no_samples固定为202422,处理第2、3个测量点时,找到的行号l1(202436、404843)已大于该值,导致self.alldata.iloc[l1:self.no_samples, 0]返回空数据集,最终生成空数组。 - 返回值错误:
extract_sensordata函数返回print(self.extract_data),而print的返回值是None,导致self.EO[n].extracted_data实际被赋值为None,而非提取到的数组。 - 硬编码样本数:样本数直接写死为202422,未根据测量点位置动态计算提取范围。
修复步骤
- 调整切片逻辑:从找到的行号
l1开始,提取固定数量的样本(而非到固定位置)。 - 修正返回值:直接返回处理后的数组,替代返回
print结果。 - 优化样本数管理:将样本数设为类属性,方便后续修改。
修正后的代码
import pandas as pd import numpy as np class unv_processing(): class vrbls: def __init__(self, extracted_data=None, timeH=None): self.extracted_data = extracted_data self.timeH = timeH def __init__(self): self.EO = {1: self.vrbls(), 2: self.vrbls(), 3: self.vrbls()} self.sample_count = 202422 # 样本数设为类属性,便于调整 def read_testdata(self, testdata): self.alldata = pd.read_csv(testdata, sep='delimiter', header=None) return self.alldata def extract_sensordata_Ntimes(self, measure_pnt): def reader(n): self.EO[n].extracted_data = self.extract_sensordata(measure_pnt[n]) for i in (1, 2, 3): reader(i) return def extract_sensordata(self, measure_pnt): l1 = None for c in range(len(self.alldata.iloc[:, 0])): if self.alldata.iloc[c, 0] == measure_pnt: l1 = c + 11 print(f'unv line number {l1}') break if l1: # 从l1开始提取指定数量样本,添加边界检查避免越界 end_idx = l1 + self.sample_count end_idx = min(end_idx, len(self.alldata)) extract_data = pd.DataFrame(self.alldata.iloc[l1:end_idx, 0]).to_numpy() extract_data = np.array([i[0].split() for i in extract_data]).astype('float64').ravel() print(extract_data) return extract_data else: print("未找到匹配的测量点") return None def main(arg_mod): s = unv_processing() s.read_testdata(arg_mod.testdata) s.extract_sensordata_Ntimes(arg_mod.measure_pnt)
内容的提问来源于stack exchange,提问作者shoggananna
相关产品推荐
相关产品推荐

