使用熊猫将多年时间序列转换为一年平均时间序列

时间:2020-04-09 15:20:00

标签: python timestamp time-series pivot-table pandas-groupby

我有一个数据框(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个数据点的数据点计数。

1 个答案:

答案 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
相关问题