如何从特定时间开始按周分组

时间:2018-11-29 10:49:12

标签: python pandas pandas-groupby

我有希望按周分组的数据。

我已经可以使用以下方法做到这一点

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具备执行此操作的功能(一种指定何时开始分组的方式)。

我希望有人知道这样做的好方法。

非常感谢

编辑:

我试图更多地使用内置功能中的python,因为它通常会更好,更一致地工作。我还将数据本身转换为带有y列的时间戳的图形,并且我希望时间戳到实际反映数据,而无需某种方法,例如将所有内容偏移6小时进行分组,然后将所有内容重新偏移6小时以获取正确的时间戳。

3 个答案:

答案 0 :(得分:1)

使用双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

答案 1 :(得分:1)

因此,要解决此问题,需要使用Grouper的基本参数。

不过需要注意的是,无论Freq使用的时间段(年,月,日等。),基数也将在其中(据我所知)。

所以我想将起始位置替换6个小时,所以我的频率需要以小时为单位,而不是几周(即1W = 168H)。

所以我正在寻找的解决方案是

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

这很简单,简短,快速,并且完全可以按照我的意愿来工作。

尽管如此,感谢所有其他答案

答案 2 :(得分:0)

我将创建带有所需日期的另一列,并根据它们进行分组

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()