2015-04-09 3 views
0

Я пытаюсь эффективно делить долгосрочные данные на 8 интервалов на каждый день. Интервалы 3 часа каждый, но края перекрываются:Python Pandas перекрывает данные с TimeGrouper

00.00 - 03.00 
03.00 - 06.00 
06.00 - 09.00 
09.00 - 12.00 
12.00 - 15.00 
15.00 - 18.00 
18.00 - 21.00 
21.00 - 24.00 

Я попытался следующие:

data = data.groupby(pd.TimeGrouper('4h', closed='left')) 
for t, group in groups: 
    print(group) 

Результат:

     X Y 
2010-01-01 00:00:00 -0.2 -2.4 
2010-01-01 01:00:00 -0.1 -2.8 
2010-01-01 02:00:00 0.8 -2.3 
2010-01-01 03:00:00 1.2 -2.0 
         X Y 
2010-01-01 04:00:00 1.2 0.0 
2010-01-01 05:00:00 0.8 0.8 
2010-01-01 06:00:00 0.3 1.8 
2010-01-01 07:00:00 -0.5 2.8 
         X Y 
2010-01-01 08:00:00 -4.6 3.7 
2010-01-01 09:00:00 -7.6 1.3 
2010-01-01 10:00:00 -8.0 -1.1 
2010-01-01 11:00:00 -7.8 -2.4 
         X Y 
2010-01-01 12:00:00 -5.4 -3.0 
2010-01-01 13:00:00 -0.3 -0.9 
2010-01-01 14:00:00 1.9 -0.3 
2010-01-01 15:00:00 2.3 0.1 
      ... 

Но то, что я хочу вместо этого:

     X Y 
2010-01-01 00:00:00 -0.2 -2.4 
2010-01-01 01:00:00 -0.1 -2.8 
2010-01-01 02:00:00 0.8 -2.3 
2010-01-01 03:00:00 1.2 -2.0 
         X Y 
2010-01-01 03:00:00 1.2 -2.0 
2010-01-01 04:00:00 1.2 0.0 
2010-01-01 05:00:00 0.8 0.8 
2010-01-01 06:00:00 0.3 1.8 
         X Y 
2010-01-01 06:00:00 0.3 1.8 
2010-01-01 07:00:00 -0.5 2.8 
2010-01-01 08:00:00 -4.6 3.7 
2010-01-01 09:00:00 -7.6 1.3 
         X Y 
2010-01-01 09:00:00 -7.6 1.3 
2010-01-01 10:00:00 -8.0 -1.1 
2010-01-01 11:00:00 -7.8 -2.4 
2010-01-01 12:00:00 -5.4 -3.0 
      ... 

(обратите внимание на дубликат poi nts по краям)

Можно ли это сделать эффективно с помощью Pandas и/или Numpy? (набор данных составляет 100 лет)

ответ

0

Это немного взломанный, но мне кажется, что вам, вероятно, нужно дать, чтобы у вас были повторяющиеся временные метки по дизайну (и они хотят их в разных группах). Обратите внимание, что это, конечно, будет работать только с регулярными интервалами.

Во-первых, просто использовать передовые/фантазии индексации дублировать каждую третью строку:

df2 = df.append(df.iloc[3::3]).sort().reset_index() 

Затем создать простой морской окунь:

df2['grp'] = df2.index.values/4 

Проверил:

for i, g in df2.groupby('grp'): print g 

     date  time X Y grp 
0 2010-01-01 00:00:00 -0.2 -2.4 0 
1 2010-01-01 01:00:00 -0.1 -2.8 0 
2 2010-01-01 02:00:00 0.8 -2.3 0 
3 2010-01-01 03:00:00 1.2 -2.0 0 
     date  time X Y grp 
4 2010-01-01 03:00:00 1.2 -2.0 1 
5 2010-01-01 04:00:00 1.2 0.0 1 
6 2010-01-01 05:00:00 0.8 0.8 1 
7 2010-01-01 06:00:00 0.3 1.8 1 
      date  time X Y grp 
8 2010-01-01 06:00:00 0.3 1.8 2 
9 2010-01-01 07:00:00 -0.5 2.8 2 
10 2010-01-01 08:00:00 -4.6 3.7 2 
11 2010-01-01 09:00:00 -7.6 1.3 2 
Смежные вопросы