使用熊猫石斑鱼按十年开始对数据帧进行分组



我有一个从 01-01-1973 到 12-31-2014 的每日观测数据框。

一直在使用熊猫石斑鱼,到目前为止,每个频率都运行良好:我想按 70 年代、80 年代、90 年代等十年对它们进行分组。

我试图这样做

import pandas as pd
df.groupby(pd.Grouper(freq = '10Y')).mean()

但是,这会将它们分为 73-83、83-93 等。

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

你可以对年份做一些算术,把它放到最近的十年:

df.groupby(df.index.year // 10 * 10).mean()

@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())

类似的东西

df.groupby(df.index.astype(str).str[:2]+'0').mean()

最新更新