【发布时间】:2019-02-15 22:19:11
【问题描述】:
我有一个包含 2 列的简单 DataFrame - 日期和值。我需要创建另一个 DataFrame,其中包含每年每个月的平均值。例如,我的每日数据范围从 2015-01-01 到 2018-12-31 我需要 2015 年、2016 年等每个月的平均值。 哪种方法最简单?
【问题讨论】:
我有一个包含 2 列的简单 DataFrame - 日期和值。我需要创建另一个 DataFrame,其中包含每年每个月的平均值。例如,我的每日数据范围从 2015-01-01 到 2018-12-31 我需要 2015 年、2016 年等每个月的平均值。 哪种方法最简单?
【问题讨论】:
您可以使用Series.dt.to_period 和mean 按月汇总:
df['date'] = pd.to_datetime(df['date'])
df1 = df.groupby(df['date'].dt.to_period('m'))['col'].mean().reset_index()
另一种将年份和月份放在不同列中的解决方案:
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df1 = df.groupby(['year','month'])['col'].mean().reset_index()
示例:
df = pd.DataFrame({'date':['2015-01-02','2016-03-02','2015-01-23','2016-01-12','2015-03-02'],
'col':[1,2,5,4,6]})
print (df)
date col
0 2015-01-02 1
1 2016-03-02 2
2 2015-01-23 5
3 2016-01-12 4
4 2015-03-02 6
df['date'] = pd.to_datetime(df['date'])
df1 = df.groupby(df['date'].dt.to_period('m'))['col'].mean().reset_index()
print (df1)
date col
0 2015-01 3
1 2015-03 6
2 2016-01 4
3 2016-03 2
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df2 = df.groupby(['year','month'])['col'].mean().reset_index()
print (df2)
year month col
0 2015 1 3
1 2015 3 6
2 2016 1 4
3 2016 3 2
【讨论】:
AttributeError: Can only use .dt accessor with datetimelike values
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
Timestamps,有时不是,所以有必要to_datetime。 :)
要在 DataFrame 具有每日数据行时获取 Data Frame 的月平均值,我会:
df['dates']转换为DataFrame的索引df:df.set_index('date',inplace=True)
dates 转换为月份索引:df.index.month
df.groupby(df.index.month).data.mean()
我去慢慢把每一步都扔到这里:
你需要先导入 Pandas 和 Numpy,以及模块datetime
from datetime import datetime
在 2019 年 1 月 1 日到 2019 年 3 月 5 日之间以“W”周为间隔生成一个列 'date'。还有一列'data',随机值在1-100之间:
date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
df = pd.DataFrame(date_rng, columns=['date'])
df['data']=np.random.randint(0,100,size=(len(date_rng)))
df 有两列 'date' 和 'data':
date data
0 2018-01-07 42
1 2018-01-14 54
2 2018-01-21 30
3 2018-01-28 43
4 2018-02-04 65
5 2018-02-11 40
6 2018-02-18 3
7 2018-02-25 55
8 2018-03-04 81
'date'column为DataFrame的索引: df.set_index('date',inplace=True)
df 有一列'data',索引为'date':
data
date
2018-01-07 42
2018-01-14 54
2018-01-21 30
2018-01-28 43
2018-02-04 65
2018-02-11 40
2018-02-18 3
2018-02-25 55
2018-03-04 81
months=df.index.month
monthly_avg=df.groupby(months).data.mean()
'monthly_avg' 月份数据集的平均值为: date
1 42.25
2 40.75
3 81.00
Name: data, dtype: float64
【讨论】: