Pandas 中的多索引、多年和每小时数据每天随机采样 N 小时

Posted

技术标签:

【中文标题】Pandas 中的多索引、多年和每小时数据每天随机采样 N 小时【英文标题】:Randomly sampling N hours each day for multi-index,multi-year, and hourly data in Pandas 【发布时间】:2013-10-15 19:34:07 【问题描述】:

是否有任何快速方法可以使用 pandas 工具在多年、多索引和每小时的数据集中每天随机抽样 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

【问题讨论】:

【参考方案1】:

更新:您将问题更改为按 X 和 Y 以及时间分组。要使用TimeGrouper(正如我在下面对您的原始问题的回答中所做的那样)以及其他分组标准(例如['X', 'Y']),请参阅this answer。

每小时分组,并使用transform 和this answer,如下所示:

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

示例:我每小时生成一个包含多个样本的数据集,我每小时随机选择两个。

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.7 版将为相同的功能添加numpy.choice,我假设会更快。

【讨论】:

丹,感谢您的回复。我相信它正在达到我想要的。但是,我即将改变我的问题,以了解我更大的问题。敬请期待……

以上是关于Pandas 中的多索引、多年和每小时数据每天随机采样 N 小时的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值

从现有数据框创建多索引

Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列

Pandas 中的多索引排序

Pandas:具有多索引的 fillna() 方法 - NaN 填充了错误的列

过滤多索引数据集(python/pandas)