Python 使用pandas将多年时间序列转换为单年平均时间序列

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

我有一个数据框(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        57.4     
Jan    1     4        88.0     
Jan    1     5        33.2
.
.
.
Dec    31    24       77.0
尝试找出pivot_tablegroupby是将时间序列转换为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