4.7 KiB
4.7 KiB
完整修复说明 - v1.2
错误根本原因
错误信息:
错误: 处理水准数据时出错 - The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
根本原因:
- 在pandas中,对numpy array使用
not操作符会触发"The truth value of an array"错误 - pandas的
.unique()返回numpy array,不能直接用于布尔判断
修复详情
修复1: find_mtime_range函数(第198-200行)
问题代码:
if original_data.empty or not nyids: # 错误:not nyids 对numpy array无效
return "", ""
修复后:
# 修复:检查nyids的长度,而不是使用not(对numpy array无效)
if original_data.empty or nyids.size == 0:
return "", ""
说明:
nyids是通过level_df["NYID"].unique()得到的numpy array- 对numpy array使用
not会触发错误 - 使用
nyids.size == 0检查数组是否为空
修复2: DataFrame类型检查(多个位置)
问题: 在多个位置,直接对可能是numpy array或DataFrame的对象进行布尔判断
修复方法:
在所有关键位置添加isinstance()检查,确保对象是预期的类型
示例1: related_settlements检查(第301行)
# 防御性检查:确保related_settlements是DataFrame
if isinstance(related_settlements, pd.DataFrame) and related_settlements.empty:
print(f" 警告: NYID={nyid} 无对应沉降数据")
continue
示例2: checkpoint_df和section_df检查(第311-327行)
# 防御性检查:确保DataFrame存在且不为空
if isinstance(checkpoint_df, pd.DataFrame) and isinstance(section_df, pd.DataFrame):
if not checkpoint_df.empty and not section_df.empty:
# 处理逻辑...
预防措施
1. 类型检查
在操作DataFrame或Series之前,总是检查类型:
if isinstance(obj, pd.DataFrame):
if not obj.empty:
# 安全操作
2. Numpy array检查
对于numpy array,不要使用not array或if array:
# 错误做法
if not array: # 触发错误
pass
# 正确做法
if array.size == 0: # 检查长度
pass
# 或者
if len(array) == 0: # 适用于1D array
pass
3. 防御性编程
总是假设数据可能不符合预期:
# 添加多层检查
if obj is not None and isinstance(obj, pd.DataFrame) and not obj.empty:
# 安全操作
完整的防御性代码模式
DataFrame操作
# 检查DataFrame是否有效
if isinstance(df, pd.DataFrame) and not df.empty:
# 执行操作
result = df[condition]
if isinstance(result, pd.DataFrame) and not result.empty:
# 继续处理
Numpy Array操作
# 获取unique值
unique_values = df["column"].unique()
# 检查unique值是否为空
if unique_values.size > 0: # 使用.size检查
# 安全操作
first_value = unique_values[0]
验证修复的方法
1. 运行脚本
python process_parquet_to_excel.py
2. 检查输出
- 应该看到"✅ 数据质量检验通过"消息
- 不应该再出现"The truth value of an array"错误
- 查看"全局数据质量统计"确认总记录数
3. 数据完整性验证
预期:水准数据记录数 = Excel记录数
如果仍有差异,请检查:
- 数据文件是否完整
- 日志中的警告信息
- 是否有缺失的沉降数据
错误处理改进
新版本包含:
- ✅ 详细的错误堆栈跟踪
- ✅ 智能错误提示
- ✅ 错误位置定位
- ✅ 数据质量自动检验
- ✅ 类型安全检查
版本历史
-
v1.2 (2025-11-08)
- 🔧 彻底修复:numpy array布尔值判断错误
- ✨ 新增:全面的防御性编程检查
- ✨ 新增:DataFrame类型验证
- ✨ 新增:多层错误防护机制
- 📝 改进:更安全的代码模式
-
v1.1 (2025-11-08)
- 🔧 部分修复:work_sites numpy array处理
- ✨ 新增:数据质量检验机制
- ✨ 新增:全局统计报告
-
v1.0 (2025-11-08)
- 初始版本
测试建议
- 全量测试:运行所有数据文件夹
- 边界测试:检查空数据或缺失数据的情况
- 性能测试:验证大数据集的处理速度
- 完整性测试:对比预期和实际记录数
维护建议
- 任何时候操作DataFrame,都要先检查
isinstance() - 任何时候操作numpy array,都要使用
.size或len()检查 - 避免直接对pandas对象使用
not操作符 - 使用
.empty属性检查DataFrame/Series是否为空 - 添加详细的错误处理和日志记录
结论:v1.2版本彻底解决了numpy array布尔值判断错误,通过全面的防御性编程确保代码的稳定性和健壮性。