2015-04-12 3 views
1

У меня есть набор данных о ценах на валюту каждую минуту, 24 часа в сутки, каждый день, в течение одного месяца. Тем не менее, рынок форекс только открыт с 17:00 в воскресенье до 16:00 в пятницу, данные между этими временами просто дополняются последним записанным значением в пятницу вечером. Я пытаюсь удалить это дополнение и оставить только данные с открытым рынком.Как извлечь подмножество временного ряда в соответствии с пользовательским интервалом, используя pandas?

Я спустил десятки тупиков и полностью потерял лес для деревьев.

Это красиво просто возвращать подмножество данных в соответствии с заданным сроки:

import pandas as pd 
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True) 

# Return all rows for times between 12:00 and 16:00 
df = df.between_time('12:00','16:00') 

Первые две строки создают dataframe из файла CSV, выделить столбец «DTIME» как index и проанализировать его как объект datetime. Третья строка возвращает все строки между 12:00 и 16:00 независимо от того, в какой день.

Простое решение одна строка будет выглядеть (псевдокод):

df = df.between_customTimeRange('Sun 17:00','Fri 16:00') 

, но очевидно, что это не работает.

Есть ли что-то простое, что я полностью забыл?

Edit: Я объединил EKomarov и ответы Александра в следующее решение от начала до конца:

import pandas as pd 
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True) 

mask = df[ (( df.index.weekday == 6) & (df.index.hour < 17))# Sunday pre 17:00 
     | ( df.index.weekday == 5)       # All of Saturday 
     | (( df.index.weekday == 4)       # Friday 
      &       ( (df.index.hour >= 16) # Friday 16.00 onwards 
            & ~((df.index.hour == 16) 
             & (df.index.minute == 0)# Exclude 16.00 itself 
             ) 
            ) 
      ) 
     ] 

df = df[~df.index.isin(mask.index)] # return all data not in mask 
df.to_csv(tradingdaysonly) 

ответ

1

Я использовал тот же подход, что и @EKomarov, но обрабатывал время по-разному. Марки - ваш индекс pd.Timestamp. Сначала создайте маску дат/раз, когда вы не хотите, а затем инвертируйте ее. Обратите внимание, что dayofweek индексируется с понедельником = 0 и воскресеньем = 6.

mask = stamps[((stamps.dayofweek == 6) & (stamps.hour < 17)) # Sunday before 17:00 
       | (stamps.dayofweek == 5) # All of Saturday 
       | ((stamps.dayofweek == 4) # Friday after 16:00 
       & (stamps.hour >= 16) 
       & ~((stamps.hour == 16) & (stamps.minute == 0)))] # Exclude 16:00 

stamps[~stamps.isin(mask)] 
+0

Это прекрасно работает. Спасибо! – Tom

1

Вот возможное решение.

Я бы свести проблему к избавлению от ненужных временных меток. Те, «неправильные» временные метки, находятся между Пт-16: 00 и Солнцем-17: 00.

Скажем, у вас есть

data = pd.Series(np.random.randn(100), index = pd.date_range('2015-04-01', periods = 100, freq = '6h')) 

Позволяет найти «неправильные» метки:

paddedTimestamps = (((data.index.dayofweek == 4) & (data.index.time > datetime.time(16,0))) | 
          (data.index.dayofweek == 5) | 
         ((data.index.dayofweek == 6) & (data.index.time < datetime.time(17,0)))) 

Теперь paddedTimestamps содержит Справедливо для каждого целого места, где метка является «неправильно», так что мы инвертировать его и запрос для данные:

nonPaddedData = data[~paddedTimestamps] 

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

  • Нет связанных вопросов^_^