2016-02-11 7 views
0

У меня есть dataframe, и я хочу, чтобы удалить некоторые специфические повторяющиеся строки:подвыборкой панды dataframe на основе индекса

import numpy as np 
import pandas as pd 
nrows = 144  
df = pd.DataFrame(np.random.rand(nrows,), pd.date_range('2016-02-08 00:00:00', periods=nrows, freq='2h'), columns=['A']) 

dataframe непрерывно со временем, предоставляя данные каждые два часа до бесконечности, но я выбрал чтобы показывать только подмножество для краткости. Я хочу удалить данные каждые 72 часа в 8:00, начиная с понедельника, чтобы совпасть с внешним событием, которое изменяет данные. Для этого моментального снимка данных я хочу удалить строки, индексированные в 2016 году, 02-08 08:00, 2016-02-11 08:00, + 3D и т. Д.

Есть ли простой способ сделать это?

+0

Непонятно, что вы хотите удалить. 36 часов! = 3 дня и 2016-02-08 - не понедельник. – Goyo

+0

В США, 8 февраля 2016 года - понедельник. –

+0

Да, я, должно быть, искал неправильный календарь. Таким образом, вы хотите удалить 2016-02-08 08:00 (первый понедельник), 2016-02-11 08:00 (через 3 дня) и 2016-02-14 08:00 (через 6 дней), а также 2016- 02-15 08:00 (понедельник), а затем перезапустить счет здесь? – Goyo

ответ

0

IIUC вы могли бы сделать это:

In [18]:  
start = df.index[(df.index.dayofweek == 0) & (df.index.hour == 8)][0] 
start 

Out[18]: 
Timestamp('2016-02-08 08:00:00') 

In [45]: 
df.loc[df.index.difference(pd.date_range(start, end=df.index[-1], freq='3D'))] 

Out[45]: 
          A 
2016-02-08 00:00:00 0.323742 
2016-02-08 02:00:00 0.962252 
2016-02-08 04:00:00 0.706537 
2016-02-08 06:00:00 0.561446 
2016-02-08 10:00:00 0.225042 
2016-02-08 12:00:00 0.746258 
2016-02-08 14:00:00 0.167950 
2016-02-08 16:00:00 0.199958 
2016-02-08 18:00:00 0.808286 
2016-02-08 20:00:00 0.288797 
2016-02-08 22:00:00 0.508109 
2016-02-09 00:00:00 0.980772 
2016-02-09 02:00:00 0.995731 
2016-02-09 04:00:00 0.742751 
2016-02-09 06:00:00 0.392247 
2016-02-09 08:00:00 0.460511 
2016-02-09 10:00:00 0.083660 
2016-02-09 12:00:00 0.273620 
2016-02-09 14:00:00 0.791506 
2016-02-09 16:00:00 0.440630 
2016-02-09 18:00:00 0.326418 
2016-02-09 20:00:00 0.790780 
2016-02-09 22:00:00 0.521131 
2016-02-10 00:00:00 0.219315 
2016-02-10 02:00:00 0.016625 
2016-02-10 04:00:00 0.958566 
2016-02-10 06:00:00 0.405643 
2016-02-10 08:00:00 0.958025 
2016-02-10 10:00:00 0.786663 
2016-02-10 12:00:00 0.589064 
...      ... 
2016-02-17 12:00:00 0.360848 
2016-02-17 14:00:00 0.757499 
2016-02-17 16:00:00 0.391574 
2016-02-17 18:00:00 0.062812 
2016-02-17 20:00:00 0.308282 
2016-02-17 22:00:00 0.251520 
2016-02-18 00:00:00 0.832871 
2016-02-18 02:00:00 0.387108 
2016-02-18 04:00:00 0.070969 
2016-02-18 06:00:00 0.298831 
2016-02-18 08:00:00 0.878526 
2016-02-18 10:00:00 0.979233 
2016-02-18 12:00:00 0.386620 
2016-02-18 14:00:00 0.420962 
2016-02-18 16:00:00 0.238879 
2016-02-18 18:00:00 0.124069 
2016-02-18 20:00:00 0.985828 
2016-02-18 22:00:00 0.585278 
2016-02-19 00:00:00 0.409226 
2016-02-19 02:00:00 0.093945 
2016-02-19 04:00:00 0.389450 
2016-02-19 06:00:00 0.378091 
2016-02-19 08:00:00 0.874232 
2016-02-19 10:00:00 0.527629 
2016-02-19 12:00:00 0.490236 
2016-02-19 14:00:00 0.509008 
2016-02-19 16:00:00 0.097061 
2016-02-19 18:00:00 0.111626 
2016-02-19 20:00:00 0.877099 
2016-02-19 22:00:00 0.796201 

[140 rows x 1 columns] 

Так это определяет диапазон запуска путем сравнения dayofweek и hour и принимая первое значение индекса, мы затем создать индекс с помощью date_range и вызвать difference по индексу удалите эти строки и передайте их loc

+0

Это решение близко к желаемому результату и будет работать, если бы я хотел маскировать данные по понедельникам. Однако мне нужно маскировать данные каждые 3 дня (72 часа), начиная с понедельника. –

+0

Ваше оригинальное сообщение было 36 часов, вы можете просто изменить 'freq = '3D'', и он должен работать – EdChum

Смежные вопросы