1

pandas ツールを使用して、複数年、複数インデックス、1 時間ごとのデータ セットで、毎日 N 時間をランダムにサンプリングする迅速な方法はありますか? 私の目標は、毎日、各 X、Y ペアに対して N ランダムな時間を取得することです。

私のデータが次のように見える場合:

In [21]: df
Out[21]:
                            Stuff
Date                X Y
2004-01-01 02:00:00 0 1  1.047065
2004-01-01 03:00:00 0 1 -1.048725
2004-01-01 04:00:00 0 1 -0.245098
2004-01-01 05:00:00 0 1  0.452306
2004-01-01 02:00:00 2 3  0.100935
2004-01-01 03:00:00 2 3 -1.183009
2004-01-01 04:00:00 2 3  0.164260
2004-01-01 05:00:00 2 3 -1.013031
2004-01-01 02:00:00 4 2 -0.300900
2004-01-01 03:00:00 4 2  0.698377
2004-01-01 04:00:00 4 2  0.335517
2004-01-01 05:00:00 4 2 -0.421466
2004-01-01 02:00:00 7 9 -0.904358
2004-01-01 03:00:00 7 9  1.496770
2004-01-01 04:00:00 7 9 -0.966784
2004-01-01 05:00:00 7 9  0.101442
2004-01-02 02:00:00 0 1  0.771495
2004-01-02 03:00:00 0 1 -1.559194
2004-01-02 04:00:00 0 1  0.497352
2004-01-02 05:00:00 0 1  0.377913
2004-01-02 02:00:00 2 3  0.637454
2004-01-02 03:00:00 2 3 -0.381010
2004-01-02 04:00:00 2 3  1.973359
2004-01-02 05:00:00 2 3  0.390250
2004-01-02 02:00:00 4 2  0.948655
2004-01-02 03:00:00 4 2  0.234342
2004-01-02 04:00:00 4 2  0.766474
2004-01-02 05:00:00 4 2 -0.529767
2004-01-02 02:00:00 7 9  0.682759
2004-01-02 03:00:00 7 9  2.202768
2004-01-02 04:00:00 7 9  2.190237
2004-01-02 05:00:00 7 9 -1.641499

(N = 2 の場合) に似た結果が得られることを願っています。

                            Stuff
Date                X Y
2004-01-01 02:00:00 0 1  1.047065
2004-01-01 05:00:00 0 1  0.452306
2004-01-01 04:00:00 2 3  0.164260
2004-01-01 05:00:00 2 3 -1.013031
2004-01-01 02:00:00 4 2 -0.300900
2004-01-01 03:00:00 4 2  0.698377
2004-01-01 02:00:00 7 9 -0.904358
2004-01-01 05:00:00 7 9  0.101442
2004-01-02 03:00:00 0 1 -1.559194
2004-01-02 04:00:00 0 1  0.497352
2004-01-02 04:00:00 2 3  1.973359
2004-01-02 05:00:00 2 3  0.390250
2004-01-02 02:00:00 4 2  0.948655
2004-01-02 05:00:00 4 2 -0.529767
2004-01-02 04:00:00 7 9  2.190237
2004-01-02 05:00:00 7 9 -1.641499
4

1 に答える 1

2

更新: X と Y および時間でグループ化するように質問を変更しました。TimeGrouper(以下のように、元の質問に対する私の回答で)他のグループ化基準(例: )とともに使用するには、この回答['X', 'Y']を参照してください。

時間ごとにグループ化transformし、この回答で次のように使用します。

df.groupby(pd.TimeGrouper('H')).transform(lambda x: x[random.sample(x.index, N)])

例: 1 時間に複数のサンプルを含むデータ セットを生成し、各時間からランダムに 2 つを選択します。

In [62]: df = DataFrame(np.random.randn(6), pd.date_range(freq='20T', start=pd.datetime.now(), periods=6))

In [63]: df
Out[63]: 
                            0
2013-10-08 14:18:49  0.709713
2013-10-08 14:38:49  1.413776
2013-10-08 14:58:49 -0.725483
2013-10-08 15:18:49  1.251557
2013-10-08 15:38:49 -1.049705
2013-10-08 15:58:49  1.100699

In [65]: df.groupby(pd.TimeGrouper('H')).transform(lambda x: x[random.sample(x.index, 2)])
Out[65]: 
                            0
2013-10-08 14:18:49  0.709713
2013-10-08 14:58:49 -0.725483
2013-10-08 15:38:49 -1.049705
2013-10-08 15:58:49  1.100699

組み込みモジュールで使用しましたrandom。numpy のバージョン 1.7numpy.choiceでは同じ機能が追加されますが、多少高速になると思います。

于 2013-10-08T18:17:08.723 に答える