对于一年的数据,我有以下数据框架:
lat lon date month ssta 90th 10th threshold year dayofyear
21680 30.375 273.875 1982-01-01 1 0.995117 1.566498 -1.620501 0 1982 1
21681 30.375 273.875 1982-01-02 1 1.765118 1.566498 -1.620501 1 1982 2
21682 30.375 273.875 1982-01-03 1 2.495117 1.566498 -1.620501 1 1982 3
....
我使用以下代码计算阈值以上/以下的连续天数序列(1=高于,-1=低于,0=介于两者之间):
aok = year['threshold'].values
for i in range(1, len(aok)):
if aok[i] == 1:
aok[i] += aok[i - 1]
if aok[i] == -1:
aok[i] += aok[i - 1]
它生成一个数组,如下所示,总结了这一年:
array([ 0, 1, 2, 0, 0, 0, -1, -2, -3, 0, -1, -2, 0,
0, 0, 0, 0, 0, 0, 0, 0, -1, -2, -3, -4, -5,
-6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18,
-19, -20, -21, -22, -23, -24, -25, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
2, 3, 4, 5, 6, 0, 0, 1, 2, 3, 4, 5, 6, 7])
(shortened for brevity; has a len of 365 )
我的问题是。是否有方法返回大于等于5和小于等于-5的序列数?我正在统计连续5天或以上高于/低于阈值的事件。例如,在上面的数组中,我知道我可以找到最大值和最小值。。我还知道我可以使用np.count\u nonzero(aok>=5)来计算阈值以上的天数。我会有一个低于平均水平的活动,持续25天,和两个高于平均水平的活动,一个持续6天,另一个持续7天。
我如何在单独的事件中返回这些信息,可能是以[-25,6,7]这样的列表形式?
太长,读不下去了如何以[-25,6,7]等形式对事件(即以0分隔的>=5和<=-5的数字序列)进行计数,如上述示例数组中所示
1条答案
按热度按时间tjrkku2a1#
如果我理解正确的话,你只是在寻找相邻的值,它们之间的值相差超过5?!如果是这样的话,您可以将数组移位1,然后像这样进行比较
这几乎可以作为3,1数组提供所需的输出。如果这让你烦恼的话
相反
我怀疑您的第一次计算可以以非常类似的方式进行,但由于您没有询问,也没有提供原始数据(阈值),因此我将不多说。也许你可以做一个有趣的裸体运动:)。