![](/img/trans.png)
[英]How do I group hourly data by day and count only values greater than a set amount in Pandas?
[英]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.