2014-11-25 1 views
1

У меня есть два набора данных, которые выглядят следующим образом:Python панд «фильтр» временные ряды для торговых дней только

enter image description here

То, что я хотел бы сделать, это отфильтровать неторговые дни на «data». Я предполагаю, что это будет сравнивать data.index.date каждой строки с data.index.date of trading_days, а затем возвращать строку, если есть совпадение. Если нет совпадения, то это не торговый день, и строка не возвращается. Это эффективно отфильтровывает набор данных неторговых дней.

Однако, переходя по строкам здесь, чтобы проверить, равны ли два data.index.dates с помощью функции apply() для возврата строки, неэффективны - я чувствую, что есть более эффективный способ сделать это, поскольку Я сделаю это на 180-битной строке данных.

Есть ли какая-то «слияние» или «присоединиться», как:

data.join(trading_days) 

, который фильтрует только для дат где date.index.date матчей? Мне нужно все это получить на минутном уровне (как показано в «data»), но просто отфильтровать даты, не связанные с торговлей. Спасибо за вашу помощь!

UPDATE, чтобы включать значения (пожалуйста, дайте мне знать, если есть лучший способ, чтобы вставить их):

In[5]: data.head(30).values 
Out[6]: 
array([[ 438.9, 438.9, 438.9, 438.9, 0. ], 
     [ 438.9, 438.9, 438.7, 438.7, 31. ], 
     [ 438.6, 438.6, 438.6, 438.6, 7. ], 
     [ 438.4, 438.7, 438.4, 438.4, 4. ], 
     [ 438.4, 438.4, 438.3, 438.3, 4. ], 
     [ 438.2, 438.2, 438.2, 438.2, 1. ], 
     [ 438.2, 438.2, 438.2, 438.2, 0. ], 
     [ 438.2, 438.2, 438.2, 438.2, 1. ], 
     [ 438.2, 438.2, 438.2, 438.2, 0. ], 
     [ 438.1, 438.1, 438.1, 438.1, 3. ], 
     [ 438. , 438. , 437.9, 438. , 6. ], 
     [ 438. , 438.2, 438. , 438. , 8. ], 
     [ 438.2, 438.2, 438.1, 438.1, 6. ], 
     [ 438.1, 438.1, 438.1, 438.1, 4. ], 
     [ 438.1, 438.1, 438.1, 438.1, 0. ], 
     [ 438.3, 438.3, 438.3, 438.3, 1. ], 
     [ 438.3, 438.3, 438.3, 438.3, 0. ], 
     [ 438.3, 438.3, 438.3, 438.3, 0. ], 
     [ 438.1, 438.1, 438.1, 438.1, 1. ], 
     [ 438. , 438. , 437.9, 437.9, 54. ], 
     [ 437.8, 437.8, 437.8, 437.8, 10. ], 
     [ 437.8, 437.8, 437.8, 437.8, 1. ], 
     [ 437.8, 437.8, 437.8, 437.8, 6. ], 
     [ 437.8, 437.8, 437.8, 437.8, 0. ], 
     [ 437.9, 438. , 437.9, 438. , 12. ], 
     [ 437.9, 438. , 437.9, 438. , 0. ], 
     [ 437.9, 438. , 437.9, 438. , 0. ], 
     [ 437.9, 438. , 437.9, 438. , 0. ], 
     [ 437.9, 437.9, 437.9, 437.9, 1. ], 
     [ 437.9, 437.9, 437.8, 437.8, 4. ]]) 

А вот временные метки:

In[10]: data.head(30).index.values 
Out[11]: 
array(['2005-01-02T13:59:00.000000000-0500', 
     '2005-01-02T14:00:00.000000000-0500', 
     '2005-01-02T14:01:00.000000000-0500', 
     '2005-01-02T14:02:00.000000000-0500', 
     '2005-01-02T14:03:00.000000000-0500', 
     '2005-01-02T14:04:00.000000000-0500', 
     '2005-01-02T14:05:00.000000000-0500', 
     '2005-01-02T14:06:00.000000000-0500', 
     '2005-01-02T14:07:00.000000000-0500', 
     '2005-01-02T14:08:00.000000000-0500', 
     '2005-01-02T14:09:00.000000000-0500', 
     '2005-01-02T14:10:00.000000000-0500', 
     '2005-01-02T14:11:00.000000000-0500', 
     '2005-01-02T14:12:00.000000000-0500', 
     '2005-01-02T14:13:00.000000000-0500', 
     '2005-01-02T14:14:00.000000000-0500', 
     '2005-01-02T14:15:00.000000000-0500', 
     '2005-01-02T14:16:00.000000000-0500', 
     '2005-01-02T14:17:00.000000000-0500', 
     '2005-01-02T14:18:00.000000000-0500', 
     '2005-01-02T14:19:00.000000000-0500', 
     '2005-01-02T14:20:00.000000000-0500', 
     '2005-01-02T14:21:00.000000000-0500', 
     '2005-01-02T14:22:00.000000000-0500', 
     '2005-01-02T14:23:00.000000000-0500', 
     '2005-01-02T14:24:00.000000000-0500', 
     '2005-01-02T14:25:00.000000000-0500', 
     '2005-01-02T14:26:00.000000000-0500', 
     '2005-01-02T14:27:00.000000000-0500', 
     '2005-01-02T14:28:00.000000000-0500'], dtype='datetime64[ns]') 

И в trading_days для чтения .csv здесь: http://pastebin.com/5N01Gi5V

ВТОРАЯ UPDATE:

enter image description here

+0

Можете ли вы разместить образцы данных в виде простого текста? –

ответ

1

Вы можете сделать присоединиться к следующим образом:

  1. Добавить стол days в data, который содержит день индекса.
  2. pd.merge(days, data, on='days')

Это делает внутреннее соединение по умолчанию, так что только те строки из data с днями, которые появляются в кадре days будет в результате.

+0

Для обоих ответов я сделал: 'data ['days'] = data.index.date' ' df = pd.merge (trading_days, data, on = 'days') ' ' # df = data. merge (trading_days, how = 'inner', left_on = 'days', right_index = True) ' ' df.count() ' И я получаю пустой dataframe ..это, наверное, глупая ошибка, но я не уверен, что понимаю, почему слияние на «дни» ничего не вернет. –

+0

Проверьте типы столбцов «дней» в двух данных. 'data.index.date' вернет объекты' datetime'. –

+0

А теперь я вижу. Хорошо, я смог объединиться, но теперь я вижу, что все мои минутные данные отсутствуют в индексе (как это было в исходном «DataFrame») любые идеи о том, как слить, но сохранить этот индекс? –

1

Вы на правильном пути. Я бы создал еще один столбец в DataFrame, который содержал значение datetime в вашем индексе, но с форматом, который был подобен формату, используемому в вашем фреймворке trading_days. Так 2005-01-02 23: 59: 00 * 00: 00 становится 2005-01-02

Затем вы можете использовать Merge http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.merge.html

data.merge (trading_days, how='inner', left_on='newcolumn', right_index=True) 
Смежные вопросы