Pandas按周几分组?

7
我有一个pandas数据框,其中索引是从2007年到2017年的日期。
我想计算每年每个工作日的平均值。我可以按年份分组:
groups = df.groupby(TimeGrouper('A'))
years = DataFrame()
for name, group in groups:
   years[name.year] = group.values

以下是我创建新数据框(years)的方法,在每个列中获得时间序列的每年。 如果我想查看每年的统计信息(例如平均值):

print(years.mean())

但是现在我想将每年的每个星期分开,以便获得所有星期的平均值。

我所知道的唯一的事情是:

year=df[(df.index.year==2007)]

day_week=df[(df.index.weekday==2)]

这样做的问题在于我必须更改七次一周中的日期,然后在接下来的11年内重复此操作(我的时间序列始于2007年,结束于2017年),因此我必须重复77次!
是否有将时间按年份和工作日分组以加快此过程的方法?

1
你认为 groups = df.groupby([df.index.year, df.index.weekday])) 合适吗? - jezrael
它有效了。我不知道我可以根据索引分组多次时间组。谢谢。 - Jvr
1个回答

4

看起来您需要通过DatetimeIndex.yearDatetimeIndex.weekdaygroupby进行操作:

rng = pd.date_range('2017-04-03', periods=10, freq='10M')
df = pd.DataFrame({'a': range(10)}, index=rng)  
print (df)
            a
2017-04-30  0
2018-02-28  1
2018-12-31  2
2019-10-31  3
2020-08-31  4
2021-06-30  5
2022-04-30  6
2023-02-28  7
2023-12-31  8
2024-10-31  9

df1 = df.groupby([df.index.year, df.index.weekday]).mean()
print (df1)
        a
2017 6  0
2018 0  2
     2  1
2019 3  3
2020 0  4
2021 2  5
2022 5  6
2023 1  7
     6  8
2024 3  9

df1 = df.groupby([df.index.year, df.index.weekday]).mean().reset_index()
df1 = df1.rename(columns={'level_0':'years','level_1':'weekdays'})
print (df1)
   years  weekdays  a
0   2017         6  0
1   2018         0  2
2   2018         2  1
3   2019         3  3
4   2020         0  4
5   2021         2  5
6   2022         5  6
7   2023         1  7
8   2023         6  8
9   2024         3  9

就像我说的那样,这正是我想要做的。清晰明了,有用的回答。 - Jvr
你会如何使用Grouper编写这个? - Niels Bom
1
@NielsBom - 我认为这是不可能的,因为 df.groupby([pd.Grouper(freq='A'), pd.Grouper(freq='W')]).mean() 看起来像是解决方案,但是对于 week,返回的是每周的周期而不是 0-7 的值,所以失败了。在这里中找不到替代方法。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接