Как группировать в неделю, начиная с определенного времени - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть данные, которые я хочу группировать по неделям.

Я смог сделать это с помощью следующего

Data_Frame.groupby([pd.Grouper(freq='W')]).count()

, это создает фрейм данных в виде

2018-01-07  ...

2018-01-14  ...

2018-01-21  ...

это здорово.Однако мне нужно, чтобы это началось в 06:00, так что-то вроде

2018-01-07 06:00:00 ...

2018-01-14 06:00:00 ...

2018-01-21 06:00:00 ...

Я знаю, что могу сместить свои данные на 6 часов, но это похоже на чит, и я почти уверен, что Grouper идет сфункциональность для этого (какой-то способ указать, когда следует начать группировку).

Я надеялся, что кто-то знает хороший метод для этого.

Большое спасибо

edit:

Я пытаюсь использовать реальные питоны во встроенной функциональности, поскольку она часто работает намного лучше и согласованнее.Я также превращаю сами данные в график с временными метками в виде столбца y, и я хотел бы, чтобы временная метка отображала данные в реальном времени, без какого-либо метода, такого как смещение всего на 6 часов, группирование и последующее смещение всего на 6 часов, чтобы получитьправильная метка времени.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Использовать двойной shift:

np.random.seed(456)

idx = pd.date_range(start = '2018-01-07', end = '2018-01-09', freq = '2H')
df = pd.DataFrame({'a':np.random.randint(10, size=25)}, index=idx)
print (df)
                     a
2018-01-07 00:00:00  5
2018-01-07 02:00:00  9
2018-01-07 04:00:00  4
2018-01-07 06:00:00  5
2018-01-07 08:00:00  7
2018-01-07 10:00:00  1
2018-01-07 12:00:00  8
2018-01-07 14:00:00  3
2018-01-07 16:00:00  5
2018-01-07 18:00:00  2
2018-01-07 20:00:00  4
2018-01-07 22:00:00  2
2018-01-08 00:00:00  2
2018-01-08 02:00:00  8
2018-01-08 04:00:00  4
2018-01-08 06:00:00  8
2018-01-08 08:00:00  5
2018-01-08 10:00:00  6
2018-01-08 12:00:00  0
2018-01-08 14:00:00  9
2018-01-08 16:00:00  8
2018-01-08 18:00:00  2
2018-01-08 20:00:00  3
2018-01-08 22:00:00  6
2018-01-09 00:00:00  7

#freq='D' for easy check, in original use `W`
df1 = df.shift(-6, freq='H').groupby([pd.Grouper(freq='D')]).count().shift(6, freq='H')
print (df1)
                      a
2018-01-06 06:00:00   3
2018-01-07 06:00:00  12
2018-01-08 06:00:00  10
0 голосов
/ 28 декабря 2018

Таким образом, чтобы решить эту проблему, необходимо использовать базовый параметр для Grouper.

Однако предостережение заключается в том, что независимо от того, какой период времени (годы, месяцы, дни и т. Д.) Для Freq, база также будет вэто (из того, что я могу сказать).

Так как я хочу сместить начальную позицию на 6 часов, то моя частота должна быть в часах, а не в неделях (т.е. 1W = 168H).

Итак, решение, которое я искал, было

Data_Frame.groupby([pd.Grouper(freq='168H', base = 6)]).count()

Это просто, коротко, быстро и работает именно так, как я хочу.

Благодаря всем остальным ответам, хотя

0 голосов
/ 29 ноября 2018

Я бы создал еще один столбец с необходимыми датами и сгруппировал их

import pandas as pd
import numpy as np

 selected_datetime = pd.date_range(start = '2018-01-07', end = '2018-01-30', freq = '1H')
 df = pd.DataFrame(selected_datetime, columns = ['date'])
 df['value1'] = np.random.rand(df.shape[0])
# specify the condition for your date, eg. starting from 6am
df['shift1'] = df['date'].apply(lambda x: x.date() if x.hour == 6 else np.nan)
# forward fill the na values to have last date
df['shift1'] = df['shift1'].fillna(method = 'ffill')
# you can groupby on this col
df.groupby('shift1')['value1'].mean()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...