【问题标题】:Resampling over dates in both levels of a MultiIndex Pandas DataFrame在 MultiIndex Pandas DataFrame 的两个级别中重新采样日期
【发布时间】:2014-07-31 02:40:32
【问题描述】:

我有一个带有 2 级 MultiIndex 的 pandas DataFrame。 MultiIndex 的两个级别都是相同的日期范围,每天间隔。我想每周对 MultiIndex 的两个级别的 DataFrame 重新采样,但我遇到了麻烦。请看下文。

为了举例,让我们让每个索引回溯 2 周:

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)

如果我直接重新采样 df,我会得到以下 TypeError:

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

公平地说,我在第一层取消堆叠并重新采样,这给出了我一半的答案:

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

我现在很茫然,如果能在每个维度上按周重新采样,我将不胜感激。

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    这需要 0.14.1(它可能也适用于 0.14.0)

    注意我认为它们是一个小问题,因为这应该通过指定级别(而不是重置并将其用作列)来工作。

    文档是here

    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
    

    【讨论】:

    • 谢谢杰夫,这正是我想要的!关于您的“应该工作”评论,您指的是我的第一次或第二次重新采样尝试吗?
    • 不,我的意思是 df.groupby([pd.Grouper(level='cohort_date',freq='W'),....]).sum() 应该可以工作(这是一个错误,请参阅此处:github.com/pydata/pandas/issues/7885
    • 哦,好的,谢谢!我想知道为什么需要 reset_index() ?如果我放弃它,我会得到“找不到石斑鱼名称队列_日期”。
    • 那是错误的 ATM。将在 0.15.0 修复。
    • 太棒了,谢谢!因为像你这样的人,我爱所以:)
    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 2013-03-25
    • 2018-01-20
    • 2017-09-19
    • 2021-12-14
    • 2019-02-16
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多