根据 hour/minute/second 拆分 DateTimeIndex 数据
Split DateTimeIndex data based on hour/minute/second
我有时间序列数据,我想根据小时、分钟或秒进行拆分。这通常是用户定义的。我想知道如何做到这一点。
例如,考虑以下内容:
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 的数据。
为此您需要使用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)
选项 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
我有时间序列数据,我想根据小时、分钟或秒进行拆分。这通常是用户定义的。我想知道如何做到这一点。
例如,考虑以下内容:
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 的数据。
为此您需要使用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)
选项 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