根据小时/分钟/秒

时间:2016-09-30 21:54:21

标签: pandas datetimeindex

我有时间序列数据,我想根据小时,分钟或秒来分割。这通常是用户定义的。我想知道如何做到这一点。

例如,请考虑以下事项:

test = pd.DataFrame({'TIME': pd.date_range(start='2016-09-30',
                                           freq='600s', periods=20)})
test['X'] = np.arange(20)

输出结果为:

    TIME                X
0   2016-09-30 00:00:00 0
1   2016-09-30 00:10:00 1
2   2016-09-30 00:20:00 2
3   2016-09-30 00:30:00 3
4   2016-09-30 00:40:00 4
5   2016-09-30 00:50:00 5
6   2016-09-30 01:00:00 6
7   2016-09-30 01:10:00 7
8   2016-09-30 01:20:00 8
9   2016-09-30 01:30:00 9
10  2016-09-30 01:40:00 10
11  2016-09-30 01:50:00 11
12  2016-09-30 02:00:00 12
13  2016-09-30 02:10:00 13
14  2016-09-30 02:20:00 14
15  2016-09-30 02:30:00 15
16  2016-09-30 02:40:00 16
17  2016-09-30 02:50:00 17
18  2016-09-30 03:00:00 18
19  2016-09-30 03:10:00 19

假设我想按小时拆分它。我想将以下内容作为一个块然后我可以保存到文件中。

    TIME                X
0   2016-09-30 00:00:00 0
1   2016-09-30 00:10:00 1
2   2016-09-30 00:20:00 2
3   2016-09-30 00:30:00 3
4   2016-09-30 00:40:00 4
5   2016-09-30 00:50:00 5

第二个块将是:

    TIME                X
0   2016-09-30 01:00:00 6
1   2016-09-30 01:10:00 7
2   2016-09-30 01:20:00 8
3   2016-09-30 01:30:00 9
4   2016-09-30 01:40:00 10
5   2016-09-30 01:50:00 11

依旧......

注意我可以完全基于逻辑条件,例如

来完成
 df[(df['TIME'] >= '2016-09-30 00:00:00') &
    (df['TIME'] <= '2016-09-30 00:50:00')]

并重复......

但是如果我的抽样变了怎么办?有没有办法创建一个需要少量代码并且效率高的掩码?我有10 GB的数据。

2 个答案:

答案 0 :(得分:4)

选项1
你可以将系列分组,而不必将它们放在你正在分组的对象中。

test.groupby([test.TIME.dt.date,
              test.TIME.dt.hour,
              test.TIME.dt.minute,
              test.TIME.dt.second]):

选项2
使用pd.TimeGrouper

test.set_index('TIME').groupby(pd.TimeGrouper('S'))  # Group by seconds
test.set_index('TIME').groupby(pd.TimeGrouper('T'))  # Group by minutes
test.set_index('TIME').groupby(pd.TimeGrouper('H'))  # Group by hours

答案 1 :(得分:3)

您需要使用groupby,并且分组应基于日期和时间:

test['DATE'] = test['TIME'].dt.date
test['HOUR'] = test['TIME'].dt.hour
grp = test.groupby(['DATE', 'HOUR'])

然后,您可以遍历组并执行所需的操作。

示例:

for key, df in grp:
    print(key, df)
((datetime.date(2016, 9, 30), 0),                  TIME  X        DATE  HOUR
0 2016-09-30 00:00:00  0  2016-09-30     0
1 2016-09-30 00:10:00  1  2016-09-30     0
2 2016-09-30 00:20:00  2  2016-09-30     0
3 2016-09-30 00:30:00  3  2016-09-30     0
4 2016-09-30 00:40:00  4  2016-09-30     0
5 2016-09-30 00:50:00  5  2016-09-30     0)


((datetime.date(2016, 9, 30), 1),                   TIME   X        DATE  HOUR
6  2016-09-30 01:00:00   6  2016-09-30     1
7  2016-09-30 01:10:00   7  2016-09-30     1
8  2016-09-30 01:20:00   8  2016-09-30     1
9  2016-09-30 01:30:00   9  2016-09-30     1
10 2016-09-30 01:40:00  10  2016-09-30     1
11 2016-09-30 01:50:00  11  2016-09-30     1)


((datetime.date(2016, 9, 30), 2),                   TIME   X        DATE  HOUR
12 2016-09-30 02:00:00  12  2016-09-30     2
13 2016-09-30 02:10:00  13  2016-09-30     2
14 2016-09-30 02:20:00  14  2016-09-30     2
15 2016-09-30 02:30:00  15  2016-09-30     2
16 2016-09-30 02:40:00  16  2016-09-30     2
17 2016-09-30 02:50:00  17  2016-09-30     2)


((datetime.date(2016, 9, 30), 3),                   TIME   X        DATE  HOUR
18 2016-09-30 03:00:00  18  2016-09-30     3
19 2016-09-30 03:10:00  19  2016-09-30     3)