如何" NaN"在给定时间段内满足给定标准时的一系列数据

时间:2016-06-27 16:31:07

标签: python if-statement for-loop while-loop

我有一个pd.dataframe,其中包含飞利浦Actiwatch的活动计数数据。如果超过60分钟没有活动计数,则用户可能没有佩戴该设备,应该删除此范围。

如何在我的Dataframe中检测> 60分钟(每行为1分钟)的句点并删除该完整句点。因此,如果59行或更少的活动计数为0,则不会发生任何事情,但如果60行或更多行的活动计数为0(假设80行),则此数据应为NaN。

可以在此处找到包含数据的csv文件: https://www.dropbox.com/s/6h43nrozohc9vd8/Actiwatch%20Data?dl=0

实在是没用,这就是我被卡住的地方:

# remove all data where Activity = 0 for 60 or more consecutive minutes: 

zero_count = 0
for n in range(len(data)):
    if data['Activity'].loc[n] == NaN:
        continue
    elif data['Activity'].loc[n] > 0:
        continue
    elif data['Activity'].loc[n] = 0:
        while data['Activity'].loc[n] = 0:
            zero_count = zero_count + 1
        if zero_count >60: 
            # NaN last zero_count number of lines.
            zero_count = 0
            break
        else:
            zero_count = 0
            break
    else:
        print "Non-wear detection error"
        break

我试图做的是检查每一行,如果它是0,它应该向&#34; zero_count&#34;添加+1。当读取非零数字时,应检查zero_count是否> 60,如果是,则应该NaN整个范围并重置zero_count。如果它<60,则只需重置zero_count而不对任何数据进行NaN。

我希望任何人都能理解我要做的事情,或者:1)使代码在上面工作,或2)更好地了解我正在尝试做的事情。

由于

1 个答案:

答案 0 :(得分:0)

你很接近,但你的代码中有一个无限循环。以及if语句中的一些逻辑有点过时了。这是一个纠正的解决方案。

streakCount = 0 # Counts the longest current streak
streakIndex = 0 # Keeps track of where the streak started
for n in range(len(data)):
    if data['Activity'].loc[n] = 0:
        if streakCount == 0:
            streakIndex = n
        streakCount += 1
    elif data['Activity'].loc[n] > 0:
        if streakCount > 60:
            for i in range(streakIndex,streamIndex+streakCount): # loop to Nan out the range of 0's
                data['Activity'].loc[i] = float('nan')
        streakCount = 0 # reset streak