【问题标题】:aggregating hourly time series by Day via pd.TimeGrouper('D'); issue @ timestamp 00:00:00 (hour 24)通过 pd.TimeGrouper('D') 按天聚合每小时时间序列;问题@时间戳00:00:00(24小时)
【发布时间】:2016-12-28 03:34:41
【问题描述】:

df:

                    hour    rev
datetime        
2016-05-01 01:00:00 1   -0.02
2016-05-01 02:00:00 2   -0.01
2016-05-01 03:00:00 3   -0.02
2016-05-01 04:00:00 4   -0.02
2016-05-01 05:00:00 5   -0.01
2016-05-01 06:00:00 6   -0.03
2016-05-01 07:00:00 7   -0.10
2016-05-01 08:00:00 8   -0.09
2016-05-01 09:00:00 9   -0.08
2016-05-01 10:00:00 10  -0.10
2016-05-01 11:00:00 11  -0.12
2016-05-01 12:00:00 12  -0.14
2016-05-01 13:00:00 13  -0.17
2016-05-01 14:00:00 14  -0.16
2016-05-01 15:00:00 15  -0.15
2016-05-01 16:00:00 16  -0.15
2016-05-01 17:00:00 17  -0.17
2016-05-01 18:00:00 18  -0.16
2016-05-01 19:00:00 19  -0.18
2016-05-01 20:00:00 20  -0.17
2016-05-01 21:00:00 21  -0.14
2016-05-01 22:00:00 22  -0.16
2016-05-01 23:00:00 23  -0.08
2016-05-02 00:00:00 24  -0.06

df.reset_index().to_dict('rec'):

[{'datetime': Timestamp('2016-05-01 01:00:00'), 'hour': 1L, 'rev': -0.02},
 {'datetime': Timestamp('2016-05-01 02:00:00'), 'hour': 2L, 'rev': -0.01},
 {'datetime': Timestamp('2016-05-01 03:00:00'), 'hour': 3L, 'rev': -0.02},
 {'datetime': Timestamp('2016-05-01 04:00:00'), 'hour': 4L, 'rev': -0.02},
 {'datetime': Timestamp('2016-05-01 05:00:00'), 'hour': 5L, 'rev': -0.01},
 {'datetime': Timestamp('2016-05-01 06:00:00'), 'hour': 6L, 'rev': -0.03},
 {'datetime': Timestamp('2016-05-01 07:00:00'), 'hour': 7L, 'rev': -0.1},
 {'datetime': Timestamp('2016-05-01 08:00:00'), 'hour': 8L, 'rev': -0.09},
 {'datetime': Timestamp('2016-05-01 09:00:00'), 'hour': 9L, 'rev': -0.08},
 {'datetime': Timestamp('2016-05-01 10:00:00'), 'hour': 10L, 'rev': -0.1},
 {'datetime': Timestamp('2016-05-01 11:00:00'), 'hour': 11L, 'rev': -0.12},
 {'datetime': Timestamp('2016-05-01 12:00:00'), 'hour': 12L, 'rev': -0.14},
 {'datetime': Timestamp('2016-05-01 13:00:00'), 'hour': 13L, 'rev': -0.17},
 {'datetime': Timestamp('2016-05-01 14:00:00'), 'hour': 14L, 'rev': -0.16},
 {'datetime': Timestamp('2016-05-01 15:00:00'), 'hour': 15L, 'rev': -0.15},
 {'datetime': Timestamp('2016-05-01 16:00:00'), 'hour': 16L, 'rev': -0.15},
 {'datetime': Timestamp('2016-05-01 17:00:00'), 'hour': 17L, 'rev': -0.17},
 {'datetime': Timestamp('2016-05-01 18:00:00'), 'hour': 18L, 'rev': -0.16},
 {'datetime': Timestamp('2016-05-01 19:00:00'), 'hour': 19L, 'rev': -0.18},
 {'datetime': Timestamp('2016-05-01 20:00:00'), 'hour': 20L, 'rev': -0.17},
 {'datetime': Timestamp('2016-05-01 21:00:00'), 'hour': 21L, 'rev': -0.14},
 {'datetime': Timestamp('2016-05-01 22:00:00'), 'hour': 22L, 'rev': -0.16},
 {'datetime': Timestamp('2016-05-01 23:00:00'), 'hour': 23L, 'rev': -0.08},
 {'datetime': Timestamp('2016-05-02 00:00:00'), 'hour': 24L, 'rev': -0.06}]

df.set_index('datetime', inplace=True)

我想按 DAY 汇总数据。所以我这样做:

dfgrped = df.groupby([pd.TimeGrouper('D')])

我想计算 sum 之类的统计数据:

dfgrped.agg(sum)

            hour    rev
datetime        
2016-05-01  276 -2.43
2016-05-02  24  -0.06

如您所见,2016-05-012016-05-02 发生了聚合。

注意,df 中的最后一个小时数据输入发生在 2016-05-02 00:00:00,这意味着是前一天最后一个小时的数据,即每天的 24 小时数据点。

但是,考虑到日期时间戳,事情并没有按照我的预期进行。我希望将所有 24 小时汇总为 2016-05-01

我想这种问题必须经常出现在各种应用程序中,当在一个小时结束时进行测量时。直到最后一小时才出现问题,这发生在第二天的 00:00:00 时间戳。

如何在 pandas 中解决这个问题?

【问题讨论】:

    标签: python pandas group-by aggregation


    【解决方案1】:

    它看起来像另一个 hack,但它应该可以完成工作:

    In [79]: df.assign(t=df.datetime - pd.Timedelta(hours=1)).drop('datetime',1).groupby(pd.TimeGrouper('D', key='t')).sum()
    Out[79]:
                hour   rev
    t
    2016-05-01   300 -2.49
    

    【讨论】:

      【解决方案2】:

      有点破解解决方案,如果您每天的起点大于一秒,您可以从日期时间列中减去一秒,然后按日期分组,这似乎适用于您的情况:

      from datetime import timedelta
      import pandas as pd
      df.groupby((df.datetime - timedelta(seconds = 1)).dt.date).sum()
      
      #             hour    rev
      #   datetime        
      # 2016-05-01   300  -2.49
      

      【讨论】:

        【解决方案3】:

        只需 .shift(-1) 或 .roll(-1)rev 列,向后一列。所以时间戳将是期间开始与期间结束。您需要添加一个时间戳。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-26
          • 1970-01-01
          相关资源
          最近更新 更多