2016-04-23 3 views
2

У меня есть код, который анализирует несколько файлов .CVS, извлекает все данные для нескольких столбцов и помещает данные в фрейм данных (называемый dfs). Теперь я пытаюсь вернуть все поля данных в dfs, которые находятся между двумя датами.Возвращаемые данные между двумя датами

Я пытаюсь использовать команду:

return dfs[(dfs['date'] >= startDate) & (dfs['date'] <= endDate)] 

но получаю следующее сообщение об ошибке:

KeyError: 'date' 

Может кто-то дайте мне знать, что я сделал не так, пожалуйста? Пожалуйста, смотрите ниже моего кода:

def getTimeseriesData(path,column_num,startDate,endDate): 
    colNames = ['date'] 
    dfs = [] 

    allfiles = glob.glob(os.path.join(path, "*.csv")) 
    for fname in allfiles: 

     name = os.path.splitext(fname)[0] 
     name = os.path.split(name)[1] 
     colNames.append(name) 

     df = pd.read_csv(fname, header=None, usecols=[0, column_num,4,5], 
         parse_dates=[0], dayfirst=True, 
         index_col=[0], names=['date', name+'_LAST',name+'_VOLUME',name+'_MKTCAP']) 

     df = df.groupby(level=0).agg('mean') 

     dfs.append(df)   

    dfs = pd.concat(dfs, axis=1) 

    return dfs[(dfs['date'] >= startDate) & (dfs['date'] <= endDate)] #<<--I think this is the problem 

глава ДФС (из которого я хочу, чтобы вернуть данные между двумя датами (скажем, между 2001-01-03 и 2001-01-05) выглядит следующим образом:

  BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME BBG.XLON.BTA.S_MKTCAP \ 
date                    
2001-01-02     572    26605510    37494.60 
2001-01-03     560    24715470    36708.00 
2001-01-04     613    52781855    40182.15 
2001-01-05     630    56600152    41296.50 
2001-01-08     633    41014402    41493.15 

      BBG.XLON.VOD.S_LAST BBG.XLON.VOD.S_VOLUME BBG.XLON.VOD.S_MKTCAP 
date                   
2001-01-02     NaN     NaN     NaN 
2001-01-03    225.00    444328736   145216.0020 
2001-01-04    239.00    488568000   154251.6643 
2001-01-05    242.25    237936704   156349.2288 
2001-01-08    227.75    658059776   146990.8642 
+0

Можете ли вы дать несколько примеров Csv Дада? – linusg

+0

Привет, linuxg, конечно, данные образца теперь включены в вопрос – Stacey

ответ

1

Здесь date это имя вашего индекса, а не имя столбца:

Изменение:

return dfs[(dfs['date'] >= startDate) & (dfs['date'] <= endDate)] 

в:

return dfs[(dfs.index >= startDate) & (dfs.index <= endDate)] 
+0

Спасибо, Майк, что попал в точку – Stacey

+0

Ваш код не похож на мой ответ. Я использую: 'dfs [(dfs.index> = startDate) & (dfs.index <= endDate)] '. –

0

в Python, '&' есть это побитовое "и", and логично "и".

Лучше всего использовать list comprehension здесь.

return [df for df in dfs if df['date'] >= startDate and df['date'] <= endDate] 

Перейдите в список dfs, проверьте для каждого элемента условия if и верните новый список со всеми элементами, которые соответствуют этим условиям.

+0

Спасибо C14L, я пробовал линию, которую вы разместили, но я получил следующую ошибку: TypeError: строковые индексы должны быть целыми числами. Любая идея, что я должен делать? – Stacey

+0

Я не знаю Панды, но, похоже, вместо 'dict()' или 'list()' где-то есть строка. Это 'dfs = pd.concat (dfs, axis = 1)' преобразует список 'dfs' в строку? Или, может быть, 'df = df.groupby (level = 0) .agg ('mean')' преобразует отдельные строки 'df' в строку? Чтобы иметь возможность сортировать его, вам нужен элемент 'list()' 'dict()'. Если у вас есть одна длинная строка, вам нужно будет ее проанализировать, прежде чем сможете ее отсортировать. – C14L

1

вы можете сделать это гораздо проще, если ваш индекс монотонно возрастающая последовательность дат:

показаны все строки, но только f рвые две колонки:

In [98]: df.iloc[:, [0,1]] 
Out[98]: 
      BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME 
date 
2001-01-02     572    26605510 
2001-01-03     560    24715470 
2001-01-04     613    52781855 
2001-01-05     630    56600152 
2001-01-08     633    41014402 

фильтрации строк, показывая первые две колонки:

In [99]: df.loc['2001-01-03':'2001-01-05', df.columns[0,1]] 
Out[99]: 
      BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME 
date 
2001-01-03     560    24715470 
2001-01-04     613    52781855 
2001-01-05     630    56600152 

или в вашем случае:

return dfs.loc[startDate:endDate] 
+0

Нарезка работает так же, как и метод OP, если даты монотонны. –

+0

@ MikeMüller, это неправильно. Использование '.ix []' также будет работать на случайно распределенных датах в индексе – MaxU

+0

Попробуйте: 'r = df.reindex (df.index [:: - 1])' Now 'r [(r.index> = start) & (r.index <= end)] 'vs.' r.ix [начало: конец] ' –

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