5

時間、分、または秒に基づいて分割したい時系列データがあります。これは通常、ユーザー定義です。どうすればできるのか知りたいです。

たとえば、次のことを考慮してください。

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

2 番目のチャンクは次のようになります。

    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 のデータがあります。

4

2 に答える 2

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
于 2016-09-30T22:53:10.513 に答える