2016-08-21 1 views
1

ДФ:.агрегирование почасовых временных рядов по дням через pd.TimeGrouper ('D'); выпуск @ метка времени 00:00:00 (час 24)

    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 ('ЗАП'):

[{'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) 

Я хочу агрегировать данные по ДЕНЬ. Так что я:

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

Я хочу, чтобы вычислить статистику, как сумму:

dfgrped.agg(sum) 

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

Как вы можете видеть, что агрегация происходит за 2016-05-01 и 2016-05-02.

Обратите внимание, что последний почасовой ввод данных в формате df происходит в 2016-05-02 00:00:00, который предназначен для данных за последний час предыдущего дня, т.е. 24-часовой часовой пояс для каждого дня ,

Однако, учитывая штамп даты и времени, все не так, как я предполагал. Я хочу, чтобы все 24 часов были агрегированы для 2016-05-01.

Я предполагаю, что такая проблема возникает часто в различных приложениях, когда измерение производится в конце часа. Это не проблема до последнего часа, которая встречается на отметке 00:00:00 следующего дня.

Как решить эту проблему в пандах?

ответ

1

это выглядит как еще один хак, но он должен делать свою работу:

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 
1

Немного хак решение, если начальная точка на каждый день больше, чем один второй, вы можете вычесть одну секунду из столбца даты и времени и затем GroupBy дата, которая, кажется, работает для вашего случая:

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 
0

Просто .shift(-1) или. roll(-1), rev колонка, задний один. Таким образом, временная метка будет началом периода против конца периода. Вам нужно добавить одну метку времени.