我有一个从01-01-1973到12-31-2014的每日观察数据框。
一直在使用Pandas Grouper,到目前为止,每个频率都运行良好:我希望将它们分组到70年代,80年代,90年代等等。
我试着这样做
import pandas as pd
df.groupby(pd.Grouper(freq = '10Y')).mean()
然而,这将它们分为73-83,83-93等。
答案 0 :(得分:11)
pd.cut
也可用于指定具有指定开始年份的常规频率。
import pandas as pd
df
date val
0 1970-01-01 00:01:18 1
1 1979-12-31 18:01:01 12
2 1980-01-01 00:00:00 2
3 1989-01-01 00:00:00 3
4 2014-05-06 00:00:00 4
df.groupby(pd.cut(df.date, pd.date_range('1970', '2020', freq='10YS'), right=False)).mean()
# val
#date
#[1970-01-01, 1980-01-01) 6.5
#[1980-01-01, 1990-01-01) 2.5
#[1990-01-01, 2000-01-01) NaN
#[2000-01-01, 2010-01-01) NaN
#[2010-01-01, 2020-01-01) 4.0
答案 1 :(得分:7)
你可以在一年内做一点算术,把它放到最近的十年:
df.groupby(df.index.year // 10 * 10).mean()
答案 2 :(得分:4)
@cᴏʟᴅsᴘᴇᴇᴅ的方法比较简洁,但保留pd.Grouper
方法,一种方法是将数据合并到一个新的日期范围,该日期范围从十年开始到结束时为止。十年,然后使用你的Grouper
。例如,给定初始df
:
date data
0 1973-01-01 -1.097895
1 1973-01-02 0.834253
2 1973-01-03 0.134698
3 1973-01-04 -1.211177
4 1973-01-05 0.366136
...
15335 2014-12-27 -0.566134
15336 2014-12-28 -1.100476
15337 2014-12-29 0.115735
15338 2014-12-30 1.635638
15339 2014-12-31 1.930645
将其与1980年至2020年的date_range
数据框合并:
new_df = pd.DataFrame({'date':pd.date_range(start='01-01-1970', end='12-31-2019', freq='D')})
df = new_df.merge(df, on ='date', how='left')
并使用您的Grouper
:
df.groupby(pd.Grouper(key='date', freq = '10AS')).mean()
这给了你:
data
date
1970-01-01 -0.005455
1980-01-01 0.028066
1990-01-01 0.011122
2000-01-01 0.011213
2010-01-01 0.029592
同样,但一次性看起来像这样:
(df.merge(pd.DataFrame(
{'date':pd.date_range(start='01-01-1970',
end='12-31-2019',
freq='D')}),
how='right')
.groupby(pd.Grouper(key='date', freq = '10AS'))
.mean())
答案 3 :(得分:4)
像
这样的东西df.groupby(df.index.astype(str).str[:2]+'0').mean()