2017-08-09 63 views
2

我有這樣一個數據幀:如何統計時間段的連續出現? - 熊貓蟒

datetime    levels  shear 
2016-05-01 00:10:00 100   5 
2016-05-01 00:10:00 200   6 
2016-05-01 00:10:00 300   10 
2016-05-01 00:10:00 400   11 
2016-05-01 00:20:00 100   7 
2016-05-01 00:20:00 300   10 
2016-05-01 00:30:00 100   5 
2016-05-01 00:30:00 200   9 
2016-05-01 00:30:00 300   12 
2016-05-01 00:30:00 400   15 
2016-05-01 00:40:00 100   19 
2016-05-01 00:40:00 200   2 
2016-05-01 00:40:00 300   18 

其在每10分鐘的時間間隔不同高度的風切變。

我想要做的是按級別對其進行分組,然後計算每個級別的剪切連續出現次數。因此,首先我創建另一列是由水平每個連續數據組的時間差:

data3_5['Delta'] = data3_5.sort_values(['levels','datetimes']).groupby('levels')['datetimes'].diff() 

然後定義一個函數來爲相同的時差的連續出現執行滾動計數:

def rolling_count(val): 
    if val == rolling_count.previous: 
     rolling_count.count +=1 
    else: 
     rolling_count.previous = val 
     rolling_count.count = 1 
    return rolling_count.count 
rolling_count.count = 0 #static variable 
rolling_count.previous = None #static variable 

應用功能,並添加了新的列:

data3_5['count'] = data3_5.sort_values(['levels','datetimes']).groupby('levels')['index'].diff().apply(rolling_count) 

然後最後打印出結果:

group = data3_5.groupby('levels', as_index=False) 
group_keys = sorted(list(group.groups.keys())) 

for each in range(0,len(group_keys)): 
    group_result = group.get_group(group_keys[each]) 
    print(group_result) 

下面是結果的一部分:

datetime    levels shear Delta  count 
2016-05-01 00:10:00 100  5  NaT  1 
2016-05-01 00:20:00 100  7  00:10:00 1 
2016-05-01 00:30:00 100  5  00:10:00 2 
2016-05-01 00:40:00 100  19  00:10:00 3 
datetime    levels shear Delta  count 
2016-05-01 00:10:00 200  6  NaT  1 
2016-05-01 00:30:00 200  9  00:20:00 1 
2016-05-01 00:40:00 200  2  00:10:00 1 

這不是所希望的結果,因爲將兩個問題: 1.對於每個電平的第一計數將被視爲NAT,因此下一次連續出現的值將被視爲第一次出現。 2.與問題1類似,對於等級200,第三個結果應該計爲2.

我該如何解決這個問題?謝謝。

回答

2

讓我們試試:

首先讓我們確保DF [ '日期時間']真的是DateTime對象:

df['datetime'] = pd.to_datetime(df['datetime']) 

df['Delta'] = df.groupby('levels')['datetime'].transform(lambda x: x-x.shift(1)) 
df['count'] = df.groupby('levels')['Delta'].transform(lambda x : x.le(pd.Timedelta('10 minutes')).cumsum()) 
df.sort_values(by='levels') 

輸出:

   datetime levels shear Delta count 
0 2016-05-01 00:10:00  100  5  NaT  0 
4 2016-05-01 00:20:00  100  7 00:10:00  1 
6 2016-05-01 00:30:00  100  5 00:10:00  2 
10 2016-05-01 00:40:00  100  19 00:10:00  3 
1 2016-05-01 00:10:00  200  6  NaT  0 
7 2016-05-01 00:30:00  200  9 00:20:00  0 
11 2016-05-01 00:40:00  200  2 00:10:00  1 
2 2016-05-01 00:10:00  300  10  NaT  0 
5 2016-05-01 00:20:00  300  10 00:10:00  1 
8 2016-05-01 00:30:00  300  12 00:10:00  2 
12 2016-05-01 00:40:00  300  18 00:10:00  3 
3 2016-05-01 00:10:00  400  11  NaT  0 
9 2016-05-01 00:30:00  400  15 00:20:00  0 
+0

謝謝斯科特,你的解決方案是很清楚直截了當,我會試一試。我認爲直接將groupby結果作爲新列添加到原始數據框中會比使用get_group之後獲得groupby結果要好得多,哪些更難處理,您的建議是什麼? –