2016-09-27 6 views
2

可変時間間隔に基づいて行をグループにグループ化したい。 しかし、グループ化するときには、日付部分を無視したいので、時刻の日付に基づくグループのみを無視します。Pandaグループのdatetime型に基づいたデータフレームは、異なる期間で日付を無視する部分

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分で開始しますか?または、最初に時間単位でソートしますか?そうであれば、最初の行の時刻は任意です。または、1日を5分の窓に分けることに満足していますか? – piRSquared

+0

@piRSquared 1日を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 

このトリックがあなたの必要性に適していることを望みます。ありがとう!

関連する問題