在熊猫中按日期分组以绘制分类分布

时间:2016-02-24 17:57:25

标签: python pandas matplotlib seaborn

我正在尝试绘制已按某些日期范围分箱的数据。

比如说我有以下数据框:

dates = pd.date_range(start=pd.datetime(2013, 6, 1), periods=50, freq='D')
df = pd.DataFrame(np.random.normal(10, 3, 50), columns=['x'], index=dates)
df[:3]
            x
2013-06-01  9.819422
2013-06-02  3.659629
2013-06-03  14.862231

我想按照3周的间隔对日期进行分组并绘制数据,这给了我正在寻找的平均值,

df.resample('3w', how='mean')

            x
2013-06-02  11.424715
2013-06-23  9.443888
2013-07-14  8.572851
2013-08-04  9.873879

但我想保留所有数据,以便我可以使用seaborn中的箱图或使用matplotlib包含标准错误。我完全坚持如何在没有明确定义范围的情况下实现这一点(这与我正在使用的实际数据帧无法实现)。似乎必须有一种相当简单的方法在pandas中执行此操作,因此输出将类似于:

            x           week
2013-06-01  9.819422    1
2013-06-02  3.659629    1
2013-06-03  14.862231   1

其中week是表示分箱数据的分类变量。任何想法将不胜感激。

2 个答案:

答案 0 :(得分:2)

也许您可以使用TimeGrouper。

df.groupby(pd.TimeGrouper('3w', how=np.mean)).describe().unstack()
               x                                                                          
           count       mean       std       min       25%        50%        75%        max
2013-06-02     2  10.864835  3.794379  8.181803  9.523319  10.864835  12.206350  13.547866
2013-06-23    21   9.888556  3.452331  3.503944  7.838625   9.739525  12.403285  16.031644
2013-07-14    21  10.475142  2.687320  6.605619  8.399518  11.209683  11.818895  16.265771
2013-08-04     6   9.471931  3.196345  5.492205  8.122607   8.502217  10.901065  14.638198

>>> g = df.groupby(pd.TimeGrouper('3w', how=np.mean)).boxplot()

enter image description here

将期间开始日期(作为字符串)添加到原始数据:

df = pd.DataFrame(np.random.normal(10, 3, 50), columns=['x'], index=dates)
tg = df.groupby(pd.TimeGrouper('3W', closed='left'))
df['period'] = None
for p, idx in tg.indices.iteritems():
    df.ix[idx, 'period'] = p.strftime('%Y-%m-%d')

>>> df.head()
                    x      period
2013-06-01   7.972202  2013-06-16
2013-06-02  12.184312  2013-06-16
2013-06-03   6.884374  2013-06-16
2013-06-04   8.414091  2013-06-16
2013-06-05  12.368407  2013-06-16

答案 1 :(得分:1)

我将如何做:

{{1}}

Timegrouper seaborn

我不知道是否有更好的方法直接使用TimeGrouper和seaborn

HTH