在MultiIndex Pandas DataFrame中按日期重采样

0 投票
1 回答
1718 浏览
提问于 2025-04-18 15:26

我有一个 pandas 的数据框(DataFrame),里面有两个层级的多重索引(MultiIndex)。这两个层级的索引都是相同的日期范围,每天都有一个数据点。我想把这个数据框按周重新采样,但遇到了一些麻烦。请看下面的内容。

为了举个例子,我们假设每个索引都回溯两周:

d0 = date.today() - timedelta(days=14)
dates = pd.date_range(d0, date.today())
date_index = pd.MultiIndex.from_product([dates, dates], names=['cohort_date', 'event_date'])
df = pd.DataFrame(np.random.randint(0, 100, 225), index=date_index)

如果我直接对数据框进行重新采样,就会出现一个类型错误(TypeError):

df.resample('W', how='sum')
[...]
TypeError: Only valid with DatetimeIndex or PeriodIndex

这也没问题,我先把数据框展开(unstack),然后在第一个层级上进行重新采样,这样得到了部分答案:

df2 = df.unstack().resample('W', how='sum').T
print df2

cohort_date   2014-07-20  2014-07-27  2014-08-03
  event_date                                    
0 2014-07-16         177         424         115
  2014-07-17         408         392         197
  2014-07-18         174         435         222
  2014-07-19         180         392         141
  2014-07-20         304         252         155
  2014-07-21         242         236         228
  2014-07-22         139         159          77
  2014-07-23         117         293          68
  2014-07-24         308         353         246
  2014-07-25         254         471         160
  2014-07-26         258         240         144
  2014-07-27         297         360         148
  2014-07-28         284         303         202
  2014-07-29         218         399         144
  2014-07-30         227         286         160

现在,如果我尝试在第二个层级上重新采样(理论上也是按日期索引),我又遇到了同样的错误:

df2.unstack().resample('W', how='sum')
[...]
TypeError: Only valid with DatetimeIndex or PeriodIndex

我现在真的不知道该怎么办了,希望能有人帮我解决在每个维度上按周重新采样的问题。

1 个回答

2

这个需要版本0.14.1(可能在0.14.0上也能用)

注意,我觉得这里有个小问题,因为这个应该通过指定级别来工作,而不是重置后把它当作一列来用。

文档可以在这里找到

In [22]: df.reset_index().groupby([pd.Grouper(key='cohort_date',freq='W'),pd.Grouper(key='event_date',freq='W')]).sum()
Out[22]: 
                           0
cohort_date event_date      
2014-07-20  2014-07-20  1292
            2014-07-27  1665
            2014-08-03   764
2014-07-27  2014-07-20  1521
            2014-07-27  2317
            2014-08-03  1071
2014-08-03  2014-07-20   871
            2014-07-27  1006
            2014-08-03   306

撰写回答