2016-09-27 66 views
2

我想根據可變的時間間隔將行分組。 但是,在做分組時,我想忽略日期部分,只根據時間日期分組。我想每5分鐘一組。基於日期時間類型的熊貓組數據幀忽略日期部分

 timestampe   val 
0 2016-08-11 11:03:00  0.1 
1 2016-08-13 11:06:00  0.3 
2 2016-08-09 11:04:00  0.5 
3 2016-08-05 11:35:00  0.7 
4 2016-08-19 11:09:00  0.8 
5 2016-08-21 12:37:00  0.9 

     into 

     timestampe    val 
0 2016-08-11 11:03:00  0.1 
2 2016-08-09 11:04:00  0.5 

     timestampe    val 
1 2016-08-13 11:06:00  0.3 
4 2016-08-19 11:09:00  0.8 

     timestampe    val 
3 2016-08-05 11:35:00  0.7 
     timestampe    val 
5 2016-08-21 12:37:00  0.9 

注意,只要時間在相同的5分鐘間隔內,不管日期如何,行都會分組。

+0

我試過TimeGrouper,它考慮了日期。還嘗試創建一個只有時間分區的附加列,但它不知何故不允許我再使用TimeGrouper。 – 9blue

+0

有沒有答案的問題。你希望5分鐘的時間間隔從第一次觀察開始?意思是,第一個觀察是11點03分,所有的行都是11點08分。如果是這樣,想象一下你拿到11點03分,然後是11點45分,然後是11點07分。你想分組11:03和11:07,然後下一個組以11:45開始?或者,你想首先按時間排序嗎?如果這是真的,那麼第一行的時間是任意的。或者,你是否滿意將一天分成5分鐘的窗戶? – piRSquared

+0

@piRSquared將當天分成5分鐘的窗口。 – 9blue

回答

3

這是假設你分割當日上漲到5分鐘窗口

df.groupby(df.timestampe.dt.hour.mul(60) \ 
      .add(df.timestampe.dt.minute) // 5) \ 
    .apply(pd.DataFrame.reset_index) 

enter image description here


for name, group in df.groupby(df.timestampe.dt.hour.mul(60).add(df.timestampe.dt.minute) // 5): 
    print name 
    print group 
    print 

132 
      timestampe val 
0 2016-08-11 11:03:00 0.1 
2 2016-08-09 11:04:00 0.5 

133 
      timestampe val 
1 2016-08-13 11:06:00 0.3 
4 2016-08-19 11:09:00 0.8 

139 
      timestampe val 
3 2016-08-05 11:35:00 0.7 

151 
      timestampe val 
5 2016-08-21 12:37:00 0.9 
+0

對不起,我沒有說清楚。所以5分鐘的窗口不僅適用於1小時的範圍。 11:35但是12:37應該在不同的窗口中。 您的解決方案只需要一小部分時間。 – 9blue

+0

@ 9blue固定的帖子。 – piRSquared

0

既然你不關心你的datetime對象的date的一部分,我想這使得所有date平等是一個很好的竅門。

df['time'] = df['timestamp'].apply(lambda x: x.replace(year=2000, month=1, day=1)) 

你得到:

  timestamp val    time 
0 2016-08-11 11:03:00 0.1 2000-01-01 11:03:00 
1 2016-08-13 11:06:00 0.3 2000-01-01 11:06:00 
2 2016-08-09 11:04:00 0.5 2000-01-01 11:04:00 
3 2016-08-05 11:35:00 0.7 2000-01-01 11:35:00 
4 2016-08-19 11:09:00 0.8 2000-01-01 11:09:00 
5 2016-08-21 11:37:00 0.9 2000-01-01 11:37:00 

現在,你可以做你的time列什麼。例如,每5分鐘一組:

grouped = df.groupby(Grouper(key='time', freq='5min')) 

grouped.count() 

        timestamp val 
time        
2000-01-01 11:00:00   2 2 
2000-01-01 11:05:00   2 2 
2000-01-01 11:10:00   0 0 
2000-01-01 11:15:00   0 0 
2000-01-01 11:20:00   0 0 
2000-01-01 11:25:00   0 0 
2000-01-01 11:30:00   0 0 
2000-01-01 11:35:00   2 2 

希望這個技巧可能適合您的需要。謝謝!