Python 使用pandas将多年时间序列转换为单年平均时间序列
我有一个数据框(df),其中的列名为date、Year、Month、Day、Hour和Energy。这是多年时间序列,我想将其转换为一个平均的单年时间序列(8760点,即365*24点),其中列能量_平均值是平均值 df是 任务是将其转换为如下所示的平均形式:Python 使用pandas将多年时间序列转换为单年平均时间序列,python,timestamp,time-series,pivot-table,pandas-groupby,Python,Timestamp,Time Series,Pivot Table,Pandas Groupby,我有一个数据框(df),其中的列名为date、Year、Month、Day、Hour和Energy。这是多年时间序列,我想将其转换为一个平均的单年时间序列(8760点,即365*24点),其中列能量_平均值是平均值 df是 任务是将其转换为如下所示的平均形式: Month Day Hour Energy_Mean Jan 1 1 22.45 Jan 1 2 73.5 Jan 1 3
Month Day Hour Energy_Mean
Jan 1 1 22.45
Jan 1 2 73.5
Jan 1 3 57.4
Jan 1 4 88.0
Jan 1 5 33.2
.
.
.
Dec 31 24 77.0
尝试找出pivot_table或groupby是将时间序列转换为8760计数数据帧的更好方法。此外,我希望输出按月份排序,而不是按字母顺序。比如一月,二月,三月,四月,而不是四月,八月
我的代码是:
p50_8760 = df.groupby(['Month', 'Day', 'Hour'])['Energy'].mean()
df_p50_8760 = p50_8760.to_frame()
输出文件没有列名,也没有8760个数据点的数据点计数。根据本问题中的回答,pivot_表和groupby可能同样适合,因为它们只是在结果的形状上有所不同。 所以选择一个你觉得更容易使用的 在我的示例中,我将使用pivot_表 为了按月份索引而不是按名称的字母顺序进行排序,我添加了一个额外的列“Month\u ind”。当然,你可以手工绘制地图。因为我们已经有了datetime列,所以我选择让Pandas完成这一步 然后,可以使用数字列“Month_ind”在末尾进行排序:
df=pd.read\u csv('data/multi\u-year\u ts.csv'))
df['date']=pd.to_datetime(df['date'])#将列转换为datetime
df['Month_ind']=df['date'].map(λe:e.Month)
pivot=pd.pivot\u表(df,索引=['Month\u ind','Day','Hour'],列=['Year'],值=['Energy']))
打印(pivot.sort_值('Month_ind'))
结果:
Energy
Year 1999 2005 2007 2019
Month_ind Day Hour
1 1 1 45.0 60.4 55.2 NaN
2 73.5 NaN NaN NaN
3 82.4 NaN NaN NaN
4 90.0 NaN NaN NaN
5 72.2 NaN NaN NaN
12 12 24 77.0 NaN NaN 84.3
Month_ind Day Hour
1 1 1 53.533333
2 73.500000
3 82.400000
4 90.000000
5 72.200000
12 12 24 80.650000
dtype: float64
请注意,这些值是不正确的(大部分是NaN
),因为我只有一个非常小的测试样本
要获得所有年份中给定日期特定小时的平均值,请首先转换轴:
print(pivot.T.mean())
最终结果:
Energy
Year 1999 2005 2007 2019
Month_ind Day Hour
1 1 1 45.0 60.4 55.2 NaN
2 73.5 NaN NaN NaN
3 82.4 NaN NaN NaN
4 90.0 NaN NaN NaN
5 72.2 NaN NaN NaN
12 12 24 77.0 NaN NaN 84.3
Month_ind Day Hour
1 1 1 53.533333
2 73.500000
3 82.400000
4 90.000000
5 72.200000
12 12 24 80.650000
dtype: float64
根据这个问题的回答,pivot_表和groupby可能同样适合,因为它们只是在结果的形状上有所不同。 所以选择一个你觉得更容易使用的 在我的示例中,我将使用pivot_表 为了按月份索引而不是按名称的字母顺序进行排序,我添加了一个额外的列“Month\u ind”。当然,你可以手工绘制地图。因为我们已经有了datetime列,所以我选择让Pandas完成这一步 然后,可以使用数字列“Month_ind”在末尾进行排序:
df=pd.read\u csv('data/multi\u-year\u ts.csv'))
df['date']=pd.to_datetime(df['date'])#将列转换为datetime
df['Month_ind']=df['date'].map(λe:e.Month)
pivot=pd.pivot\u表(df,索引=['Month\u ind','Day','Hour'],列=['Year'],值=['Energy']))
打印(pivot.sort_值('Month_ind'))
结果:
Energy
Year 1999 2005 2007 2019
Month_ind Day Hour
1 1 1 45.0 60.4 55.2 NaN
2 73.5 NaN NaN NaN
3 82.4 NaN NaN NaN
4 90.0 NaN NaN NaN
5 72.2 NaN NaN NaN
12 12 24 77.0 NaN NaN 84.3
Month_ind Day Hour
1 1 1 53.533333
2 73.500000
3 82.400000
4 90.000000
5 72.200000
12 12 24 80.650000
dtype: float64
请注意,这些值是不正确的(大部分是NaN
),因为我只有一个非常小的测试样本
要获得所有年份中给定日期特定小时的平均值,请首先转换轴:
print(pivot.T.mean())
最终结果:
Energy
Year 1999 2005 2007 2019
Month_ind Day Hour
1 1 1 45.0 60.4 55.2 NaN
2 73.5 NaN NaN NaN
3 82.4 NaN NaN NaN
4 90.0 NaN NaN NaN
5 72.2 NaN NaN NaN
12 12 24 77.0 NaN NaN 84.3
Month_ind Day Hour
1 1 1 53.533333
2 73.500000
3 82.400000
4 90.000000
5 72.200000
12 12 24 80.650000
dtype: float64