3

我有一个DataFrame财务数据:

              open    high     low   close     volume
date                                                 
2012-02-13  0.3476  0.3592  0.3449  0.3530  105990679
2012-02-14  0.3470  0.3528  0.3409  0.3429  131799968
2012-02-15  0.3453  0.3513  0.3365  0.3393  119421442
2012-02-16  0.3358  0.3438  0.3271  0.3438  123189697
2012-02-17  0.3488  0.3588  0.3464  0.3546  167932148
2012-02-20  0.3590  0.3682  0.3577  0.3634  127657258
2012-02-21  0.3630  0.3675  0.3524  0.3575  137016196

我目前将其分组为:

agg = {'open': lambda s: s[0],
       'high': lambda s: s.max(),
       'low': lambda s: s.min(),
       'close': lambda s: s[-1],
       'volume': lambda s: s.sum()}

通过

df.groupby(lambda d: d.isocalendar()[:2]).agg(agg)

除了我的数据现在由(year, week). 我希望数据按组中最早成员的日期进行索引。我目前的 hack 大致如下:

agg['date'] = lambda s: s[0]
df2 = df.copy()
df2['date'] = df2.index
df2.groupby(lambda d: d.isocalendar()[:2]).agg(agg).set_index('date')

这似乎可行,但是我想知道是否有一种方法可以分离分组和索引,以便组键不会自动成为帧索引。

4

1 回答 1

2

据我所知,您正在寻找的分隔不存在,但是......假设索引已排序(这也是您的hack所必需的),对 groupby 函数稍作更改即可满足您的需求。

In [194]: cache = {}

In [195]: df.groupby(lambda d: cache.setdefault(d.isocalendar()[:2], d)).agg(agg)
Out[195]:
             close    high     low    open     volume
2012-02-13  0.3546  0.3592  0.3271  0.3476  648333934
2012-02-20  0.3575  0.3682  0.3524  0.3590  264673454
于 2012-08-14T10:19:09.680 回答