在MultiIndex Pandas DataFrame中按日期重采样
我有一个 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