繁体   English   中英

仅当存在足够数据时,如何有条件地将数据重新采样为每小时值?

[英]How do I conditionally resample data into hourly values only when enough data is present?

我第一次尝试更棘手的事情并来到这里寻求建议。 我试图对有时以 10 分钟为增量的数据进行重新采样,以便仅当一半或更多数据是实际值而不是 NaN 值时,我才能获得每小时值。 如果超过 50% 是 NaN,我如何仍然返回 NaN 值? 这样我仍然有一个连续的时间序列(至少在时间戳方面)。

我正在通过 jupyterlab 笔记本在 Python 3 工作(不确定这是否有所作为)。

这是我正在尝试做的一个小例子:

假设我使用的雨量计需要维修一个小时,因此没有记录任何数据:

Datetime          Precip
2014-07-01 00:00  0.2
2014-07-01 00:10  0.3
2014-07-01 00:20  0.1
2014-07-01 00:30  0.0
2014-07-01 00:40  NaN
2014-07-01 00:50  NaN
2014-07-01 01:00  NaN
2014-07-01 01:10  NaN
2014-07-01 01:20  NaN
2014-07-01 01:30  NaN
2014-07-01 01:40  0.0
2014-07-01 01:50  0.0

我希望重新采样返回以下 output,其中第一个小时被重新采样(因为它有超过 50% 的数据),第二个小时作为 NaN 返回。

Datetime          Precip
2014-07-01 00:00  0.15
2014-07-01 00:10  NaN

到目前为止,我只是这样重新采样:

df['Precip'].resample(rule = 'h').mean()

然而,这显然会重新采样所有内容。

我找到了以下 function 问题的解决方案:

在 function 中,perc_of_NaN 是 NaN 值的阈值,高于该阈值您要排除任何平均值。 例如。 如果超过 60% 的数据点为 NaN,则不希望进行重采样,则 perc_of_NaN 将为 60。

此外, Averaging_number 是您想要一起重新采样的行数(可以是时间步长/无论您的数据是什么)。

def NaN_Resample(Dataframe,perc_of_NaN,Averaging_number):
rows = int(len(Dataframe)/Averaging_number)
columns = int(len(Dataframe.columns))
Output = pd.DataFrame(np.zeros((rows,columns)))
dec_of_NaN = perc_of_NaN/100
for x in range (columns):
    for y in range (rows):
        if Dataframe.iloc[(y*Averaging_number):((y*Averaging_number)+(Averaging_number-1)),x].isna().sum()>(Averaging_number*dec_of_NaN): 
            Output.iloc[y,x] == 'NaN'
        Output.iloc[y,x] = Dataframe.iloc[(y*Averaging_number):((y*Averaging_number)+(Averaging_number-1)),x].mean()
return Output

如果对您有帮助,请随时使用该功能/询问有关它的任何问题:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM