2015-12-10 2 views
2

У меня есть dataframe df1 проиндексированы DateTime с записями каждые минут в течение недели образца:Как получить весь день данные индекса соответствия один день

  SAMPLE_TIME  Bottom  Top  Out  state                  
0 2015-07-15 16:41:56  48.625 55.812 43.875  1  
1 2015-07-15 16:42:55  48.750 55.812 43.875  1  
2 2015-07-15 16:43:55  48.937 55.812 43.875  1  
3 2015-07-15 16:44:56  49.125 55.812 43.812  1  
4 2015-07-15 16:45:55  49.312 55.812 43.812  1  

Я хочу найти день с низкой Avg (TempBottom , TempTop), а затем получить все данные дня на минуте, так что я могу построить этот день, я попробовал:

df2 = df1.groupby(pd.TimeGrouper('D')).agg(min) \ 
.sort(['TempTop','TempBottom'], ascending=[True,True]) 

Который дает мне самые низкие дни температуры упорядоченным. образец:

SAMPLE_TIME  Bottom  Top  Out  state                  
2015-10-17  19.994 25.840 21.875  0  
2015-08-29  26.182 28.777 25.937  0  
2015-11-19  19.244 33.027 28.937  0   
2015-11-07  19.744 33.527 28.125  0   

тогда я, хотя это все что мне нужно, чтобы принять индекс первого элемента из df2:

df1[df2.index[1]] 

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

KeyError: Timestamp('2015-08-29 00:00:00') 

ответ

3

От docs:

Warning

The following selection will raise a KeyError ; otherwise this selection methodology would be inconsistent with other selection methods in pandas (as this is not a slice, nor does it resolve to one)

dft['2013-1-15 12:30:00']

To select a single row, use .loc

In [71]: dft.loc['2013-1-15 12:30:00'] 
Out[71]: 
A 0.193284 
Name: 2013-01-15 12:30:00, dtype: float64 

Таким образом, вы должны использовать loc метод в случае:

In [103]: df1.loc[df2.index[0]] 
Out[103]: 
      SAMPLE_TIME TempBottom TempTop TempOut State Bypass 
2015-07-15 16:41:56  48.625 55.812 43.875  1  1 
2015-07-15 16:42:55  48.750 55.812 43.875  1  1 
2015-07-15 16:43:55  48.937 55.812 43.875  1  1 
2015-07-15 16:44:56  49.125 55.812 43.812  1  1 
2015-07-15 16:45:55  49.312 55.812 43.812  1  1 

EDIT

Когда вы передаете единственный аргумент, который пытается получить доступ с лейблом. Однако, когда вы проходите интервал, он используется как срез. Вы можете сделать трюк, чтобы передать значение + 1 день:

In [276]: df2.index[0] 
Out[276]: Timestamp('2015-07-15 00:00:00', offset='D') 

In [277]: df2.index[0] + 1 
Out[277]: Timestamp('2015-07-16 00:00:00', offset='D') 

In [278]: df1.loc[df2.index[0]: df2.index[0] + 1] 
Out[278]: 
        TempBottom TempTop TempOut State Bypass 
SAMPLE_TIME              
2015-07-15 16:41:56  48.625 55.812 43.875  1  1 
2015-07-15 16:42:55  48.750 55.812 43.875  1  1 
2015-07-15 16:43:55  48.937 55.812 43.875  1  1 
2015-07-15 16:44:56  49.125 55.812 43.812  1  1 
2015-07-15 16:45:55  49.312 55.812 43.812  1  1 

EDIT2

Или вы можете конвертировать date из Timestamp в str:

In [355]: df2.index[0] 
Out[355]: Timestamp('2015-07-15 00:00:00', offset='D') 

In [356]: df2.index[0].date() 
Out[356]: datetime.date(2015, 7, 15) 

In [357]: str(df2.index[0].date()) 
Out[357]: '2015-07-15' 

In [359]: df1[str(df2.index[0].date())] 
Out[359]: 
        TempBottom TempTop TempOut State Bypass 
2015-07-15 16:41:56  48.625 55.812 43.875  1  1 
2015-07-15 16:42:55  48.750 55.812 43.875  1  1 
2015-07-15 16:43:55  48.937 55.812 43.875  1  1 
2015-07-15 16:44:56  49.125 55.812 43.812  1  1 
2015-07-15 16:45:55  49.312 55.812 43.812  1  1 
+0

Я попробовал ваш но теперь я получаю это вместо «KeyError:» метка [2015-11-04 00:00:00] не находится в [index] ' ' – InsaneBot

+0

Однако это работает' df1.loc [' 2015-11- 04 '] 'проблема возникает в дополнительной точности (времени), которая включает ed в индексе – InsaneBot

+0

Вам нужно сохранить свой индекс в 'df1' как дату или вы можете преобразовать его на сегодняшний день? Если вы можете преобразовать его на дату, тогда вы можете использовать 'df1.loc [df2.index [0] .date()]' –

2

Так вот процесс мышления что я сделал, в сочетании с @Anton Protopopov Ответ:

In [1]: df1.ix[df2] 
# call trace 
ValueError: Cannot index with multidimensional key 

In [2]: df1.ix[df2.index] 
out[2]: 
SAMPLE_TIME  Bottom  Top  Out  state                  
2015-10-17   NaN  NaN  NaN  NaN   
2015-08-29   NaN  NaN  NaN  NaN   
2015-11-19   NaN  NaN  NaN  NaN   
2015-11-07   NaN  NaN  NaN  NaN   

In [3]: df1.ix[df2.index[4:5]] 
Out[3]: 
SAMPLE_TIME  Bottom  Top  Out  state                  
2015-11-04   NaN  NaN  NaN  NaN  

In [33]: df1.loc[df2.index[4:5]] 
KeyError: "None of [DatetimeIndex(['2015-11-04'], dtype='datetime64[ns]', name=u'SAMPLE_TIME', freq=None, tz=None)] are in the [index]" 

Наконец я сдался на ix и решил сделать loc работу, так как Anton рекомендовал я попробовать:

In [4]: df1.loc[df2.index[0].date()] 
KeyError: 'the label [2015-11-04] is not in the [index]' 

меня думать, что LOC принимает только строки, которые в конечном счете работали:

In [5]: df1.loc[df2.index[4].strftime('%Y-%m-%d')] 
Out[5]: 
SAMPLE_TIME    Bottom  Top  Out  state                  
2015-11-04 00:00:22  56.256 56.300 43.750  0  
2015-11-04 00:01:22  56.256 56.300 43.812  0  
2015-11-04 00:02:22  56.256 56.300 43.812  0  
2015-11-04 00:03:22  56.256 56.300 43.812  0  
+0

Вы можете сделать функцию 'str' для преобразуйте 'date' в' str' с 'str (df2.index [4] .date()), который я считаю более простым, чем' strftime'. Btw, какие версии 'python' и' pandas' вы используете? Я использую '3.4.3' и' 0.17.1'. –

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

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