2016-03-20 2 views
3

でダウンサンプリングを使用する別の方法:のは、いくつかの1分のデータを見てみましょうパンダ

In [513]: rng = pd.date_range('1/1/2000', periods=12, freq='T') 
In [514]: ts = Series(np.arange(12), index=rng) 
In [515]: ts 
Out[515]: 
2000-01-01 00:00:00  0 
2000-01-01 00:01:00  1 
2000-01-01 00:02:00  2 
2000-01-01 00:03:00  3 
2000-01-01 00:04:00  4 
2000-01-01 00:05:00  5 
2000-01-01 00:06:00  6 
2000-01-01 00:07:00  7 
2000-01-01 00:08:00  8 
2000-01-01 00:09:00  9 
2000-01-01 00:10:00  10 
2000-01-01 00:11:00  11 
Freq: T 

では、各グループの 和をとることにより、5分間の塊やバーには、このデータを集計したいとします

In [516]: ts.resample('5min', how='sum') 
Out[516]: 
2000-01-01 00:00:00 0 
2000-01-01 00:05:00 15 
2000-01-01 00:10:00 40 
2000-01-01 00:15:00 11 
Freq: 5T 

しかし、私はresampleメソッドを使用したいとは思っていませんが、同じ入出力が必要です。 group_byまたはreindexなどの方法を使用するにはどうすればよいですか?

+0

あなたが気に入らない 'resample'の特徴はありますか?それとも宿題のような問題ですか? –

+1

groupbyで時間グループを使うことができます – JohnE

+0

あなたは宿題のような問題だと考えるかもしれません。 –

答えて

3

あなたはこのようにカスタムpd.Grouperを使用することができます。

In [78]: ts.groupby(pd.Grouper(freq='5min', closed='right')).sum() 
Out [78]: 
1999-12-31 23:55:00  0 
2000-01-01 00:00:00 15 
2000-01-01 00:05:00 40 
2000-01-01 00:10:00 11 
Freq: 5T, dtype: int64 

closed='right'は、出力がまったく同じであることを保証します。


はしかし、あなたの目的は、複数のカスタムグループ化を行うことであれば、あなたがあなた自身のベクターで.groupbyを使用することができます(

In [78]: buckets = (ts.index - ts.index[0])/pd.Timedelta('5min') 
In [79]: grp = ts.groupby(np.ceil(buckets.values)) 

In [80]: grp.sum() 
Out[80]: 
0  0 
1 15 
2 40 
3 11 
dtype: int64 

出力はまったく同じではありませんが、この方法は、より柔軟性があります例えば不均一なバケットを作成することがあります)。

関連する問題