我有一个数据框(df),其列名为日期,年,月,日,小时和能量。我想将其转换为多年时间序列,将其转换为具有(8760点,即365 * 24点)的平均单年时间序列,其中Energy_Mean列为平均值。
df是
date Year Month Day Hour Energy
1/1/1999 0:00 1999 Jan 1 1 45.0
1/1/1999 1:00 1999 Jan 1 2 73.5
1/1/1999 2:00 1999 Jan 1 3 82.4
1/1/1999 3:00 1999 Jan 1 4 90.0
1/1/1999 4:00 1999 Jan 1 5 72.2
.
.
.
12/31/1999 23:00 1999 Dec 12 24 77.0
.
.
.
12/31/2019 23:00 2019 Dec 12 24 84.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个数据点的数据点计数。
答案 0 :(得分:0)
根据此SO问题Pandas: group by and Pivot table difference中的答复, pivot_table 和 groupby 可能都同样适用,因为它们的结果形式不同。 因此,选择一个您认为更易于使用的软件。
在我的示例中,我将使用数据透视表。
为了按月索引而不是按字母顺序排序,我添加了一个附加列“ Month_ind”。当然,您可以手动进行映射。因为我们已经有一个datetime列,所以我选择让Pandas执行此步骤。
然后可以使用数字列'Month_ind'进行最后排序:
df = pd.read_csv('data/multi_year_ts.csv')
df['date'] = pd.to_datetime(df['date']) # convert column to datetime
df['Month_ind'] = df['date'].map(lambda e: e.month)
pivot = pd.pivot_table(df, index=['Month_ind', 'Day', 'Hour'], columns=['Year'], values=['Energy'])
print(pivot.sort_values('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
请注意,这些值是不正确的(而且大多是NaN
),因为我只有非常小的测试样本。
要获取所有年份中给定日期特定小时的平均值,请首先移转支点:
print(pivot.T.mean())
最终结果:
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