2016-09-30 13 views
3

時間、分、または秒に基づいて分割したい時系列データがあります。これは一般的にユーザー定義です。私はそれがどのようにできるか知りたいです。例えば時間/分/秒に基づく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 

は、私は時間でそれを分割するとします。私はファイルに保存することができる1つのチャンクとして以下のものを望みます。

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')] 

、などの論理条件に基づいて、それを行うことができますように...

注意繰り返して....

buサンプリングが変わるとどうなりますか?コード量が少なくて効率的なマスクなどを作成する方法はありますか?私は10 GBのデータを持っています。

答えて

2

あなたはこのために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) 
2

オプション1
あなたがグループ化しているオブジェクトでそれらをせずにシリーズをGROUPBYすることができます。

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 
関連する問題