【问题标题】:pandas count values for last 7 days from each date从每个日期开始的最后 7 天的熊猫计数值
【发布时间】:2015-11-25 10:45:36
【问题描述】:

有两个数据框。首先是这样的:

print df1

        id        date    month  is_buy
     0  17  2015-01-16  2015-01       1
     1  17  2015-01-26  2015-01       1
     2  17  2015-01-27  2015-01       1
     3  17  2015-02-11  2015-02       1
     4  17  2015-03-14  2015-03       1
     5  18  2015-01-28  2015-01       1
     6  18  2015-02-12  2015-02       1
     7  18  2015-02-25  2015-02       1
     8  18  2015-03-04  2015-03       1

在第二个数据框中,有一些从第一个数据框中按月汇总的数据:

df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).agg({'is_buy': np.sum})

print df2

        id    month       buys
     0  17  2015-01          3
     1  17  2015-02          1
     2  17  2015-03          1
     3  18  2015-01          1
     4  18  2015-02          2
     5  18  2015-03          1

我正在尝试获取名为“last_week_buys”的新 df2 列,其中包含从每个 df1['month'] 的第一天起的最后 7 天的汇总购买。换句话说,我想得到这个:

        id    month       buys    last_week_buys
     0  17  2015-01          3               NaN
     1  17  2015-02          1                 2
     2  17  2015-03          1                 0
     3  18  2015-01          1               NaN
     4  18  2015-02          2                 1
     5  18  2015-03          1                 1

有什么想法可以得到这个专栏吗?

【问题讨论】:

  • 取决于您如何定义上个月的最后一周(最后 7 天?、最后 5 个交易日等),应该很容易计算每月的购买数量上周,然后将这个系列转移到下个月。
  • @KevinS,是的,需要计算最后 7 天的购买量。我尝试将 df1 中的数据不仅按月分组,而且按一年中的一周分组,但注意到,这个日历周可以包括 1 或 2 天……但我肯定需要 7 天。

标签: python pandas python-datetime


【解决方案1】:

这可以通过一些日期操作魔法和分组来完成:

# datetimeindex makes convenient manipulations
date = pd.DatetimeIndex(df1['date'])

# compute df2: totals by month
df1['month'] = date.to_period('M')
df2 = df1[df1['is_buy'] == 1].groupby(['id', 'month']).sum()

# compute df3: totals by last seven days
from datetime import timedelta
is_last_seven = date.to_period('M') != (date + timedelta(days=7)).to_period('M')
df3 = df1[(df1['is_buy'] == 1) & is_last_seven].groupby(['id', df1.month + 1]).sum()

# join the results
result = df2.join(df3, rsuffix='_last_seven')

结果如下:

>>> print(result)

            is_buy  is_buy_last_seven
id month                             
17 2015-01       3                NaN
   2015-02       1                  2
   2015-03       1                NaN
18 2015-01       1                NaN
   2015-02       2                  1
   2015-03       1                  1

然后您可以根据需要填写NaN 值。

【讨论】:

  • 如果它不会让您复杂化——我怎样才能获得唯一购买日期的数量?我尝试使用 .agg({'is_buy': np.sum, 'date': lambda x: x.nunique()}) 但这个变体是错误的(在“日期”列中,我有类似 '1970-01- 01 00:00:00.000000002' 或 NaT) @jakevdp
  • 你可以先尝试清理日期,使用类似df1['date'] = pd.DatetimeIndex(df1['date']).to_period('D')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多