小组时间序列

时间:2017-07-13 18:20:52

标签: python pandas date group-by

有没有办法在每30分钟或x分钟的所有日期对时间序列进行分组。我的问题与this非常相似。如果我想在约会中按小时分组,我只需要

data=pd.DataFrame({'Values':  1,'Date':pd.date_range('01-01-2017',periods=3600,freq='T')})
data.set_index(['Date'],inplace=True)
grouped=data.groupby(data.index.hour)

运行for循环并打印最后一组给我:

for time,group in grouped:
    print(group)   
                     Values
Date                       
2017-01-01 23:00:00       1
2017-01-01 23:01:00       1
2017-01-01 23:02:00       1
2017-01-01 23:03:00       1
2017-01-01 23:04:00       1
2017-01-01 23:05:00       1
2017-01-01 23:06:00       1
2017-01-01 23:07:00       1
2017-01-01 23:08:00       1
2017-01-01 23:09:00       1
2017-01-01 23:10:00       1
2017-01-01 23:11:00       1
2017-01-01 23:12:00       1
2017-01-01 23:13:00       1
2017-01-01 23:14:00       1
2017-01-01 23:15:00       1
2017-01-01 23:16:00       1
2017-01-01 23:17:00       1
2017-01-01 23:18:00       1
2017-01-01 23:19:00       1
2017-01-01 23:20:00       1
2017-01-01 23:21:00       1
2017-01-01 23:22:00       1
2017-01-01 23:23:00       1
2017-01-01 23:24:00       1
2017-01-01 23:25:00       1
2017-01-01 23:26:00       1
2017-01-01 23:27:00       1
2017-01-01 23:28:00       1
2017-01-01 23:29:00       1
                    ...
2017-01-02 23:30:00       1
2017-01-02 23:31:00       1
2017-01-02 23:32:00       1
2017-01-02 23:33:00       1
2017-01-02 23:34:00       1
2017-01-02 23:35:00       1
2017-01-02 23:36:00       1
2017-01-02 23:37:00       1
2017-01-02 23:38:00       1
2017-01-02 23:39:00       1
2017-01-02 23:40:00       1
2017-01-02 23:41:00       1
2017-01-02 23:42:00       1
2017-01-02 23:43:00       1
2017-01-02 23:44:00       1
2017-01-02 23:45:00       1
2017-01-02 23:46:00       1
2017-01-02 23:47:00       1
2017-01-02 23:48:00       1
2017-01-02 23:49:00       1
2017-01-02 23:50:00       1
2017-01-02 23:51:00       1
2017-01-02 23:52:00       1
2017-01-02 23:53:00       1
2017-01-02 23:54:00       1
2017-01-02 23:55:00       1
2017-01-02 23:56:00       1
2017-01-02 23:57:00       1
2017-01-02 23:58:00       1
2017-01-02 23:59:00       1

但是没有times.30min命令。

编辑: 我试图将所有日期的每30分钟分组一次。我希望输出完全像上面的命令,但是x分钟。默认grouped = df.groupby(pd.TimeGrouper('30T'))不起作用,因为它会单独对日期进行分组。因此,如果我有2017-01-01和2017-01-02,pd.TimeGrouper('30T')的分钟日期时间戳,请将0:00-0:30 2017-01-010:00-0:30 2017-01-02拆分为单独的组。我希望他们合并。

2 个答案:

答案 0 :(得分:4)

使用pd.TimeGrouper

grouped = df.groupby(pd.TimeGrouper('30T'))

演示

tidx = pd.date_range('2017-03-01', periods=240, freq='T')

df = pd.DataFrame(np.random.randint(10, size=(len(tidx), 3)), tidx, list('ABC'))

df.groupby(pd.TimeGrouper('30T')).sum()

                       A    B    C
2017-03-01 00:00:00  134  115  145
2017-03-01 00:30:00  139  113  130
2017-03-01 01:00:00  159  123  147
2017-03-01 01:30:00  115  143  156
2017-03-01 02:00:00  144  145  134
2017-03-01 02:30:00  142  143  166
2017-03-01 03:00:00  152  154  130
2017-03-01 03:30:00  121  121  170

答案 1 :(得分:4)

好的,我想我想要这样做:

data=pd.DataFrame({'Values':  1,'Date':pd.date_range('01-01-2017',periods=3600,freq='T')})
data.set_index(['Date'],inplace=True)

g = data.groupby([data.index.hour, data.index.minute // 15])
#this will group the each day in 15-minute intervals for all dates.
for n,g in grouped:
    print(g)

输出:

                    Values
Date                       
2017-01-01 00:00:00       1
2017-01-01 00:01:00       1
2017-01-01 00:02:00       1
2017-01-01 00:03:00       1
2017-01-01 00:04:00       1
2017-01-01 00:05:00       1
2017-01-01 00:06:00       1
2017-01-01 00:07:00       1
2017-01-01 00:08:00       1
2017-01-01 00:09:00       1
2017-01-01 00:10:00       1
2017-01-01 00:11:00       1
2017-01-01 00:12:00       1
2017-01-01 00:13:00       1
2017-01-01 00:14:00       1
2017-01-02 00:00:00       1
2017-01-02 00:01:00       1
2017-01-02 00:02:00       1
2017-01-02 00:03:00       1
2017-01-02 00:04:00       1
2017-01-02 00:05:00       1
2017-01-02 00:06:00       1
2017-01-02 00:07:00       1
2017-01-02 00:08:00       1
2017-01-02 00:09:00       1
2017-01-02 00:10:00       1
2017-01-02 00:11:00       1
2017-01-02 00:12:00       1
2017-01-02 00:13:00       1
2017-01-02 00:14:00       1

您可以使用pd.Grouperresample。 (注意:pd.TimeGrouper no advantages超过pd.Grouper。)

方法1使用pd.Grouper

df = pd.DataFrame({'Values':  1,'Date':pd.date_range('01-01-2017',periods=3600,freq='T')})

df.groupby(pd.Grouper(freq='15T',key='Date')).sum()

输出:

                     Values
Date                       
2017-01-01 00:00:00      15
2017-01-01 00:15:00      15
2017-01-01 00:30:00      15
2017-01-01 00:45:00      15
2017-01-01 01:00:00      15

方法2使用resample

df.resample('15T', on='Date').sum()

输出:

                     Values
Date                       
2017-01-01 00:00:00      15
2017-01-01 00:15:00      15
2017-01-01 00:30:00      15
2017-01-01 00:45:00      15
2017-01-01 01:00:00      15

如果你的日期在索引中作为日期时间dtype,那么你有一个DatetimeIndex,你需要省略方法1和方法2中的keyon参数。