【问题标题】:Pandas timeseries groupby using TimeGrouperPandas 时间序列 groupby 使用 TimeGrouper
【发布时间】:2017-02-27 14:06:26
【问题描述】:

我有一个像这样的时间序列

            Time    Demand
Date        
2014-01-01  0:00    2899.0
2014-01-01  0:15    2869.0
2014-01-01  0:30    2827.0
2014-01-01  0:45    2787.0
2014-01-01  1:00    2724.0
2014-01-01  1:15    2687.0
2014-01-01  1:30    2596.0
2014-01-01  1:45    2543.0
2014-01-01  2:00    2483.0

它以 15 分钟为增量。我想要每天每小时的平均值。所以我尝试了这样的df.groupby(pd.TimeGrouper(freq='H')).mean()。它的结果不太正确,因为它返回的主要是NaNs

现在我的数据集全年都有这样的数据,我想计算所有月份所有小时的平均值,这样我就有 24 个点,但平均值是一年中所有小时的平均值,例如第一个小时得到所有月份第一个小时的平均值。预期的输出将是

 2014 00:00:00  2884.0
 2014 01:00:00  2807.0
 2014 02:00:00  2705.5
 2014 03:00:00  2569.5
 ..........
 2014 23:00:00  2557.5

我怎样才能做到这一点?

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    我认为您需要先将Time 列添加到index

    df.index = df.index + pd.to_timedelta(df.Time + ':00')
    print (df)
                         Time  Demand
    2014-01-01 00:00:00  0:00  2899.0
    2014-01-01 00:15:00  0:15  2869.0
    2014-01-01 00:30:00  0:30  2827.0
    2014-01-01 00:45:00  0:45  2787.0
    2014-01-01 01:00:00  1:00  2724.0
    2014-01-01 01:15:00  1:15  2687.0
    2014-01-01 01:30:00  1:30  2596.0
    2014-01-01 01:45:00  1:45  2543.0
    2014-01-01 02:00:00  2:00  2483.0
    
    print (df.groupby(pd.Grouper(freq='H')).mean())
    #same as
    #print (df.groupby(pd.TimeGrouper(freq='H')).mean())
                         Demand
    2014-01-01 00:00:00  2845.5
    2014-01-01 01:00:00  2637.5
    2014-01-01 02:00:00  2483.0
    

    感谢pansen 的另一个想法resample

    print (df.resample("H").mean())
                         Demand
    2014-01-01 00:00:00  2845.5
    2014-01-01 01:00:00  2637.5
    2014-01-01 02:00:00  2483.0
    

    编辑:

    print (df)
                Time  Demand
    Date                    
    2014-01-01  0:00     1.0
    2014-01-01  0:15     2.0
    2014-01-01  0:30     4.0
    2014-01-01  0:45     5.0
    2014-01-01  1:00     1.0
    2014-01-01  1:15     0.0
    2015-01-01  1:30     1.0
    2015-01-01  1:45     2.0
    2015-01-01  2:00     3.0
    
    df.index = df.index + pd.to_timedelta(df.Time + ':00')
    print (df)
                         Time  Demand
    2014-01-01 00:00:00  0:00     1.0
    2014-01-01 00:15:00  0:15     2.0
    2014-01-01 00:30:00  0:30     4.0
    2014-01-01 00:45:00  0:45     5.0
    2014-01-01 01:00:00  1:00     1.0
    2014-01-01 01:15:00  1:15     0.0
    2015-01-01 01:30:00  1:30     1.0
    2015-01-01 01:45:00  1:45     2.0
    2015-01-01 02:00:00  2:00     3.0
    
    df1 = df.groupby([df.index.year, df.index.hour]).mean().reset_index()
    df1.columns = ['year','hour','Demand']
    print (df1)
       year  hour  Demand
    0  2014     0     3.0
    1  2014     1     0.5
    2  2015     1     1.5
    3  2015     2     3.0
    

    对于DatetimeIndex 使用:

    df1 = df.groupby([df.index.year, df.index.hour]).mean()
    df1.index = pd.to_datetime(df1.index.get_level_values(0).astype(str) + 
                               df1.index.get_level_values(1).astype(str), format='%Y%H')
    print (df1)
                         Demand
    2014-01-01 00:00:00     3.0
    2014-01-01 01:00:00     0.5
    2015-01-01 01:00:00     1.5
    2015-01-01 02:00:00     3.0
    

    【讨论】:

    • 很好的解决方案,修改后的df.index :-)。对于聚合,您也可以使用df.resample("H").mean(),而不需要 groupby,这更容易一些。
    • 不错的解决方案。现在我的数据集全年都有这样的数据,我想计算所有月份所有时间的平均值,这样我就有 24 个点,但平均值是一年中所有时间的平均值,例如第一个小时获得所有月份的第一个小时的平均值。我怎样才能做到这一点?
    • 您可以添加一些具有所需输出的示例吗?因为我不确定我是否理解你。谢谢。
    • 2014 00:00:00 2845.5 2014 01:00:00 2657.5 2014 02:00:00 2423.0
    • 因为 cmets 的格式很糟糕。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多