我正在使用包含环境值(sentinel2 卫星:NDVI)的数据框,例如:
Date ID_151894 ID_109386 ID_111656 ID_110006 ID_112281 ID_132408
0 2015-07-06 0.82 0.61 0.85 0.86 0.76 nan
1 2015-07-16 0.83 0.81 0.77 0.83 0.84 0.82
2 2015-08-02 0.88 0.89 0.89 0.89 0.86 0.84
3 2015-08-05 nan nan 0.85 nan 0.83 0.77
4 2015-08-12 0.82 0.77 nan 0.65 nan 0.42
5 2015-08-22 0.85 0.85 0.88 0.87 0.83 0.83
这些列对应于不同的地方,而 nan 值是由于多云条件(比利时经常发生)。显然还有更多的价值。为了去除异常值,我使用了 timesat 手册 (Jönsson & Eklundh, 2015) 中描述的方法:
- 它与中位数的偏差超过最大偏差(此处称为截止值)
- 值小于其直接邻居的平均值减去截止值或大于其直接邻居的最大值加上截止值
所以,我制作了下面的代码来做到这一点:
NDVI = pd.read_excel("C:/Python_files/Cartofor/NDVI_frene_5ha.xlsx")
date = NDVI["Date"]
MED = NDVI.median(axis = 0, skipna = True, numeric_only=True)
SD = NDVI.std(axis = 0, skipna = True, numeric_only=True)
cutoff = 1.5 * SD
for j in range(1,21): #columns
for i in range(1,480): #rows
if (NDVIF.iloc[i,j] < (((NDVIF.iloc[i-1,j] + NDVIF.iloc[i+1,j])/2) - cutoff.iloc[j])):
NDVIF.iloc[i,j] == float('NaN')
elif (NDVIF.iloc[i,j] > (max(NDVIF.iloc[i-1,j], NDVIF.iloc[i+1,j]) + cutoff.iloc[j])): #2)
NDVIF.iloc[i,j] == float('NaN')
elif ((NDVIF.iloc[i,j] >= abs(MED.iloc[j] - cutoff.iloc[j]))) & (NDVIF.iloc[i,j] <= abs(MED.iloc[j] + cutoff.iloc[j])): #1)
NDVIF.iloc[i,j] == NDVIF.iloc[i,j]
else:
NDVIF.iloc[i,j] == float('NaN')
问题是我需要省略计算的“NaN”值。目标是拥有一个像上面那样没有异常值的数据框。
完成此操作后,我必须对新选择的时间索引的值进行插值(例如,从 2016 年到 2020 年,每天一个值或每五天一个值)并将每个插值列写入 txt 文件以将其输入 TimeSat 软件.
我希望我的英语不是太差,谢谢你的回答!:)