我正在处理光伏组件的天气数据。我得到的辐照度数据集(常规时间序列,1 秒数据)显示了该领域经常出现的一个问题:有时,零值在不应该出现的情况下(白天)出现,例如由于仪器或数据写入错误。
我过去有效的解决方案如下:
df['PoA_corr'] = df['PoA'].replace(0,np.nan).resample('1s').mean().interpolate(method='linear',axis=0).ffill().bfill()
其中PoA
:原始,有问题,,PoA_corr
我尝试纠正错误。
然而,从下图可以看出,并非所有错误点都得到了适当的纠正:问题在于,在该点PoA == 0
之前和之后的 1-4 个点也是不正确的(即图中的“V”形一个点 ==0 的数据需要用前后“V”点之间的插值线替换)。
我有一些想法,但对于哪个是最好的,哪个是最 Pythonic(或能够做到)感到困惑。
获取索引列表 where
PoA == 0
,查看上方 3 秒(行),然后替换 6-8 秒(=6-8 行)的数据。我设法在白天使用找到点列表,between_time
然后使用 a 找到上面的点timedelta
,但我不知道如何替换/覆盖随后的 6-8 行(或在点“X-4”和“ X+4",其中 X 是PoA == 0
. 的位置。df 很大(2.3 GB),所以我不愿意对此使用 for 循环。目前,我的日期时间列表中 PoA == 0 在白天是发现为:df.between_time('09:00','16:00').loc[df['PoA']==0]['datetime']
对数据进行某种形式的移动窗口,以便如果窗口内的任何值 == 0,则 => 在窗口的第一个值和最后一个值之间进行插值。在这里,我对如何做到这一点感到困惑。
是在熊猫中找到解决方案,还是建议使用 numpy 或纯 python?