pandas DataFrame逐行计算时间差返回NaT问题求助
问题原因
- 算术运算索引自动对齐:pandas中两个DataFrame做减法时会自动匹配行索引和列索引,只有索引完全一致的位置才会计算值,否则返回空值。你取的
first_row行索引是1,second_row行索引是2,行索引无法匹配,所以所有计算结果都是NaT。 - 列名重复冲突:你创建
frame_ca、frame_ny、frame_tx的时候没有指定列名,三个DataFrame的列名都是默认的0,concat之后总表的列名会出现重复的0,会导致后续按列索引取值时出现混乱。 - 切片范围错误:你测试代码里写的
loc[1:1, :1]取的是列索引≤1的列,和你实际需要的全列时间数据匹配不上,也可能引发计算异常。
解决方法
首先修正预处理阶段的代码,给每个地点的时间列指定唯一列名,避免重复:
# 预处理时给每个DataFrame指定对应地点的列名 frame_ca = pd.DataFrame(data = ca_time, dtype = "datetime64[s]", columns=["ca"]) frame_ny = pd.DataFrame(data = ny_time, dtype = "datetime64[s]", columns=["ny"]) frame_tx = pd.DataFrame(data = tx_time, dtype = "datetime64[s]", columns=["tx"]) # fl、az两个地点的处理逻辑同上,补充对应列名即可 # 拼接总表 full_array = pd.concat([frame_ca, frame_ny, frame_tx, frame_fl, frame_az], axis=1)
你可以直接用pandas内置的diff()方法批量计算每列相邻行的时间差,不需要手动逐行取值计算,效率更高也更不容易出错:
# 直接计算每列相邻行的时间差,默认计算规则为当前行 - 上一行 time_diff = full_array.diff(axis=0).dt.total_seconds() # 定位异常值:差值不等于1800秒(30分钟)的位置 abnormal_mask = time_diff != 1800 # 输出异常行的索引和对应差值 abnormal_records = time_diff[abnormal_mask.any(axis=1)]
如果你需要单独测试两行的减法,需要先把两个行的索引统一之后再计算:
first_row = full_array.loc[1].reset_index(drop=True) second_row = full_array.loc[2].reset_index(drop=True) delta = second_row - first_row
内容的提问来源于stack exchange,提问作者Renaissance Man
相关产品推荐
相关产品推荐

