使用带有日期列的pandas数据框架找到年度平均值。

8
        id      vi       dates     f_id
0  5532714  0.549501  2015-07-07    ff_22
1  5532715  0.540969  2015-07-08    ff_22
2  5532716  0.531477  2015-07-09    ff_22
3  5532717  0.521029  2015-07-10    ff_22
4  5532718  0.509694  2015-07-11    ff_22

在上面的数据框中,我想要找到每年的平均值。但是这样不起作用:
df.groupby(df.dates.year)['vi'].transform(mean)

我遇到了这个错误:*** AttributeError: 'Series'对象没有属性'year'。如何修复?
3个回答

11

让我们确保日期是日期时间类型,然后使用.dt访问器作为.dt.year:

df['dates'] = pd.to_datetime(df.dates)
df.groupby(df.dates.dt.year)['vi'].transform('mean')

输出:

0    0.530534
1    0.530534
2    0.530534
3    0.530534
4    0.530534
Name: vi, dtype: float64

1

更新并完善@piRsquared的示例,以适应最新版本的pandas(例如v1.1.0),使用Grouper函数代替已弃用的TimeGrouper

import pandas as pd
import numpy as np
tidx = pd.date_range('2010-01-01', '2013-12-31', name='dates')
np.random.seed([3,1415])
df = pd.DataFrame(dict(vi=np.random.rand(tidx.size)), tidx)
df.groupby(pd.Grouper(freq='1Y')).mean()

0

你也可以使用 pd.TimeGrouper 和频率 A

考虑由四年每日数据组成的数据框 df

tidx = pd.date_range('2010-01-01', '2013-12-31', name='dates')

np.random.seed([3,1415])
df = pd.DataFrame(dict(vi=np.random.rand(tidx.size)), tidx)

df.groupby(pd.TimeGrouper('A')).mean()

                  vi
dates               
2010-12-31  0.465121
2011-12-31  0.511640
2012-12-31  0.491363
2013-12-31  0.516614

对于那些使用最近版本的pandas的用户,TimeGrouper已被弃用。 - tagoma

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