2016-02-02 2 views
1

Я только начал использовать pandas пару дней назад, и я тоже не привычный пользователь Python. Я нахожу следующее поведение loc в примере, показанном ниже озадачивает:pandas: поведение индексатора на основе метки (loc) с датами

import pandas as pd 
dates = pd.date_range('2015-01-01', '2015-01-07') 
df = pd.DataFrame({'Sunnyland':[34, 36, 32, 37, 34, 36, 38], 'Freezeville':[4, 5, 6, 5, 5, 3, 2]}, index=dates) 

создает dateframe:

[Простите вопрос форматирования с именами столбцов, они должны быть приведены в соответствие со столбцами таблицы ]:

Freezeville Sunnyland 
2015-01-01 4 34 
2015-01-02 5 36 
2015-01-03 6 32 
2015-01-04 5 37 
2015-01-05 5 34 
2015-01-06 3 36 
2015-01-07 2 38 

Теперь давайте использовать loc для выбора строк:

df.loc['2015-01-02'] # select single row 

Это работает, как ожидалось, выводя Series объект:

Freezeville  5 
Sunnyland  36 
Name: 2015-01-02 00:00:00, dtype: int64 

Следующая отлично работает слишком

df.loc['2015-01-02':'2015-01-06'] # select range of rows: 

выводя:

Freezeville Sunnyland 
2015-01-02 5 36 
2015-01-03 6 32 
2015-01-04 5 37 
2015-01-05 5 34 
2015-01-06 3 36 

Проблема в том, со следующим утверждением:

df.loc[['2015-01-02', '2015-01-06']] # comma-separated list of rows 

который производит

Freezeville  Sunnyland 
2015-01-02 NaN  NaN 
2015-01-06 NaN  NaN 

Я бы думал, что была какая-то проблема логического вывода типа встречающийся здесь - за исключением того, что в этом случае я бы ожидать KeyError или что-то, а не результат видел.

Итак, что объясняет, и как я могу выбрать несколько (произвольных) строк по дате?

+1

Я думаю, вы должны использовать 'df.loc [['2015-01-02', '2015-01-06'],:]' to получить то, что вы хотите. Также может потребоваться использовать кортеж вместо списка –

+0

@YannisP. Это порождает ошибку: «KeyError:» [['2015-01-02', '2015-01-06']] не находятся в ALL в [index] '. И с кортежем, то есть' df.loc [ ('2015-01-02', '2015-01-03'),:] 'Я получаю то же поведение, что и у меня с моим подходом. – Aky

ответ

3

Я не знаю, объяснение, возможно, текущая реализация трудно обобщать в список индексации. Он будет работать, если вы используете фактические временные метки вместо строк:

In [31]: df.loc[pd.DatetimeIndex(['2015-01-02', '2015-01-06'])] 
Out[31]: 
      Freezeville Sunnyland 
2015-01-02   5   36 
2015-01-06   3   36 
1

Я думаю, что вам нужно преобразовать строку в datetime по to_datetime и получить date, потому что вам нужно индекс соответствия:

print pd.to_datetime('2015-01-02') 
2015-01-02 00:00:00 

print pd.to_datetime('2015-01-02').date() 
2015-01-02 

print df.loc[[pd.to_datetime('2015-01-02').date(), pd.to_datetime('2015-01-06').date()]] 
      Freezeville Sunnyland 
2015-01-02   5   36 
2015-01-06   3   36 
Смежные вопросы