Sentinel-2影像处理:替换DataFrame中-3.402823466e+38为NaN失败
解决Sentinel-2影像裁剪后-3.402823466e+38值替换NaN失败的问题
问题根源
你遇到的-3.402823466e+38不是随机值,它是float32类型能表示的最小有限值(可通过np.finfo(np.float32).min获取精确值)。之前替换失败的核心原因是:你手动输入的数值是float64精度,而数据本身是float32类型,二者二进制存储存在细微差异,直接用==匹配根本找不到目标值。
针对性解决方案
1. 在rasterio读取阶段处理(最高效)
直接在数组层面替换,用numpy提供的float32最小值常量匹配,彻底避免精度问题:
import rasterio import numpy as np with rasterio.open(each_directory) as src: array = src.read(1) # 获取float32类型的最小有限值 float32_min = np.finfo(np.float32).min # 替换目标值为NaN array[array == float32_min] = np.nan # 同时保留你指定的NoData值替换 array[array == -4.444444] = np.nan
注:如果数组原本是float32类型,赋值np.nan会自动转为float32格式的NaN,不影响后续处理。
2. DataFrame层面处理
如果数据已经存入DataFrame,同样用float32最小常量进行替换:
import numpy as np float32_min = np.finfo(np.float32).min # 针对Valeurs列的数组批量替换 df_annee['Valeurs'] = df_annee['Valeurs'].apply( lambda arr: np.where(arr == float32_min, np.nan, arr) ) # 若列内数据为float32类型,也可直接用replace df_annee.replace(float32_min, np.nan, inplace=True)
3. 后续计算与绘图修正
替换完成后:
- 计算均值时使用
np.nanmean(),它会自动忽略NaN值:mean_value = np.nanmean(df_annee['Valeurs']) - seaborn会自动跳过NaN值,不会再出现因极小值导致的绘图失真问题。
额外优化提示
你可以在QGIS裁剪阶段直接避免生成该极值:在裁剪(栅格)工具中,找到NoData值参数填入-4.444444,同时勾选将输出范围之外的像素设置为NoData,从源头减少后续处理步骤。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

