Python循环中向数组列添加元素报错及需求实现咨询
解决状态切换时间捕捉代码中的NumPy数组报错问题
我明白你要做的事:从Excel里的4列设备数据中,捕捉状态(0/非0)切换的时间点,还要识别连续两次切换的情况,最后生成对应4列的时间数组。你代码里的bubblelife[:,z].append(time[i])报错,主要是因为对NumPy数组和Python列表的用法搞混了,我来帮你修正:
错误原因分析
- 空NumPy数组无法动态扩展:你一开始把
bubblelife(空列表)转成了空NumPy数组np_bubblelife,但空数组没有维度,直接用[:,z]索引会触发索引错误,而且NumPy数组不支持像列表那样的append动态添加元素(需要用np.append但也不适合这种逐列构建的场景) - 循环范围错误:你的数据有4列(
racklife = x1.iloc[:,1:5]),但z的循环是range(0,3),只覆盖了前3列,漏掉了第4列 - 索引越界风险:
bl_racklife.iloc[i-2,z]当i=1时会取i-2=-1,这会引发索引错误
修正后的代码
import os import numpy as np import pandas as pd import datetime file = 'RackTime.xlsx' x1 = pd.read_excel(file, sheet_name="Dataset1") time = x1.iloc[:,0] racklife = x1.iloc[:,1:5] bl_racklife = racklife != 0 # 初始化4个空列表,分别对应4列的状态切换时间 bubblelife = [[] for _ in range(4)] prematurebreak = [[] for _ in range(4)] # 遍历每一列(0到3,共4列) for z in range(4): # 从第2行开始遍历(i从1开始,对应原数据的第2行) for i in range(1, len(bl_racklife)): # 捕捉状态切换的时间点 if bl_racklife.iloc[i-1,z] != bl_racklife.iloc[i,z]: bubblelife[z].append(time[i]) # 处理连续两次切换的情况,注意i至少为2才不会索引越界 if i >= 2 and bl_racklife.iloc[i-2,z] != bl_racklife.iloc[i-1,z] and bl_racklife.iloc[i,z] != bl_racklife.iloc[i-1,z]: prematurebreak[z].append(time[i-1]) # 转成NumPy数组(如果需要的话) np_bubblelife = np.array(bubblelife) np_prematurebreak = np.array(prematurebreak) # 也可以转成DataFrame,更方便查看和后续处理 df_bubblelife = pd.DataFrame(np_bubblelife).T print(df_bubblelife)
代码说明
- 用列表的列表来存储每列的时间点:
[[] for _ in range(4)]为4列分别初始化空列表,这样可以直接通过bubblelife[z].append()给对应列添加元素 - 修正了循环范围:
range(4)覆盖全部4列数据 - 给
prematurebreak的判断加了i >=2的条件,避免i=1时i-2=-1的索引越界问题 - 最后可以选择转成NumPy数组或者DataFrame,DataFrame的格式更接近你期望的列输出样式
期望输出示例(转成DataFrame后)
如果你的数据符合预期,输出会是类似这样的4列时间数据:
0 1 2 3 0 3/26/2018 0:18 3/26/2018 2:22 3/26/2018 0:18 3/26/2018 0:18 1 3/26/2018 1:29 3/26/2018 2:40 3/26/2018 0:36 3/26/2018 0:36 2 3/26/2018 1:47 3/26/2018 3:15 3/26/2018 0:54 3/26/2018 2:58 ...
内容的提问来源于stack exchange,提问作者FifthCode
相关产品推荐
相关产品推荐

