代码之家  ›  专栏  ›  技术社区  ›  eugene

熊猫,按周分组数据

  •  2
  • eugene  · 技术社区  · 7 年前

    一年大约有54周。

    我想得到每个弱者的销售总额。

    (我的数据如下:

     userId,movieId,rating,timestamp
     1,31,2.5,1260759144
    

    )

    1week (1/1 - 1/7) : 30$
    2week (1/8 - 1/14) : 40$
    ...
    54week (12/24 - 12/31) : 50$
    

    我写的日期( 1/1 以此类推)只是为了解释,我想得到周组(得到季节性指数),而不必从 1/1 或者类似的。。

    数据可能包含多年。

    我想在几年内按周分组,就像你可以按月分组一样[一月,二月。。。。。12组为多年数据。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    7 年前

    使用 Series.resample 通过 week mean

    rng = pd.date_range('2017-04-03', periods=10)
    s = pd.DataFrame({'a': range(10)},index=rng)['a']
    print (s)
    2017-04-03    0
    2017-04-04    1
    2017-04-05    2
    2017-04-06    3
    2017-04-07    4
    2017-04-08    5
    2017-04-09    6
    2017-04-10    7
    2017-04-11    8
    2017-04-12    9
    Freq: D, Name: a, dtype: int64
    
    s1 = s.resample('W').mean()
    #alternative
    #s1 = s.groupby(pd.Grouper(freq='W')).mean()
    print (s1)
    2017-04-09    3
    2017-04-16    8
    Freq: W-SUN, Name: a, dtype: int64
    

    s1 = s.groupby(s.index.strftime('%Y-%U')).mean()
    print (s1)
    2017-14    2.5
    2017-15    7.5
    Name: a, dtype: float64
    

    编辑:

    对于需要预处理的样本数据:

    print (df)
       userId  movieId  rating   timestamp
    0       1       31     2.5  1260759144
    1       1       31     2.5  1560759144
    
    
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
    
    w = df['timestamp'].rename('week').dt.weekofyear
    df = df['rating'].groupby(w).mean().reset_index(name='val')
    print (df)
       week  val
    0    25  2.5
    1    51  2.5
    
        2
  •  0
  •   enongad    7 年前

    您可以先创建一个week列,以指定datetime from pandas

    df['week'] = pd.to_datetime(df['timestamp']).dt.week
    df['year'] = pd.to_datetime(df['timestamp']).dt.year
    weekly_sales = df.groupby(['year','week'])['sales'].sum()