【问题标题】:Convert multi-year time series into a single year averaged time series using pandas使用 pandas 将多年时间序列转换为单年平均时间序列
【发布时间】:2020-04-09 15:20:00
【问题描述】:

我有一个数据框 (df),其中包含名为 date、Year、Month、Day、Hour 和 Energy 的列。这是多年时间序列,我想将其转换为平均单年时间序列(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_tablegroupby 是否是 pandas 用于将时间序列转换为 8760 计数数据帧的更好方法。此外,我希望输出按月份排序,而不是按字母顺序排序。比如一月、二月、三月、四月而不是四月、八月……

我的代码是:

p50_8760 = df.groupby(['Month', 'Day', 'Hour'])['Energy'].mean()
df_p50_8760 = p50_8760.to_frame()

输出文件没有列名或 8760 个数据点的数据点计数。

【问题讨论】:

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


    【解决方案1】:

    根据此 SO 问题Pandas: group by and Pivot table difference pivot_tablegroupby 中的响应,它们可能同样适合,因为它们仅在结果的形状上有所不同。 所以选择你觉得更容易使用的那个。

    对于我的示例,我将使用 pivot_table。

    为了按月份索引而不是按名称的字母顺序排序,我添加了一个附加列“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
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2016-11-16
      • 1970-01-01
      • 2015-05-13
      • 2021-01-24
      • 2013-06-07
      相关资源
      最近更新 更多