我有一个 Pandas 数据框,其中的索引是从2007年到2017年的日期。
我想计算每年每个工作日的平均值。我可以按年份分组:
groups = df.groupby(TimeGrouper('A'))
years = DataFrame()
for name, group in groups:
years[name.year] = group.values
这是我创建新数据框(年)的方式,其中在每一列中我获取时间序列的每一年。
如果我想查看每年的统计数据(例如,平均值):
print(years.mean())
但是现在我想将每年的每一天都分开,以便获得当时所有时间的每个工作日的平均值。
我唯一知道的是:
year=df[(df.index.year==2007)]
day_week=df[(df.index.weekday==2)]
问题是我必须在一周中的一天更改7次,然后重复11年(我的时间序列从2007年开始到2017年结束),所以我必须做77次!
有没有一种方法可以按年和周日对时间进行分组,以使其更快?
最佳答案
看来您需要 groupby
和 DatetimeIndex.year
一起使用DatetimeIndex.weekday
:
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