Ключевая ошибка при разделении данных таймсерий с помощью индекса - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующие Timeseries данные.

price_per_year.head()
            price
      date  
2013-01-02  20.08
2013-01-03  19.78
2013-01-04  19.86
2013-01-07  19.40
2013-01-08  19.66

price_per_year.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 782 entries, 2013-01-02 to 2015-12-31
Data columns (total 1 columns):
price    756 non-null float64
dtypes: float64(1)
memory usage: 12.2 KB

Я пытаюсь извлечь данные за 3 года, используя приведенный ниже код. Почему я получаю KeyError: '2014', когда данные, как показано ниже, явно содержат «2014». Оцените любые входные данные.

price_per_year['2014'].head()
            price
      date  
2014-01-01  NaN
2014-01-02  39.59
2014-01-03  40.12
2014-01-06  39.93
2014-01-07  40.92

prices = pd.DataFrame()
for year in ['2013', '2014', '2015']:
    price_per_year = price_per_year.loc[year, ['price']].reset_index(drop=True)
    price_per_year.rename(columns={'price': year}, inplace=True)
    prices = pd.concat([prices, price_per_year], axis=1)

KeyError: '2014'

Строка кода price_per_year.loc['2014', ['price']] при независимом использовании вне for loop работает нормально, а price_per_year['price'][year] при использовании в for loop не работает.

for year in ['2013', '2014', '2015']:
    price_per_year = price_per_year['price'][year].reset_index(drop=True)

KeyError: 'price'

Обе строки кода price_per_year.loc[price_per_year.index.year == 2014, ['price']] при независимом использовании вне for loop и price_per_year.loc[price_per_year.index.year == year, ['price']] внутри for loop дают ошибки.

for year in ['2013', '2014', '2015']:
    price_per_year.loc[price_per_year.index.year == '2014', ['price']].reset_index(drop=True)

TypeError: Cannot convert input [False] of type <class 'bool'> to Timestamp

1 Ответ

1 голос
/ 06 августа 2020

Вот проблема, в вашем первом коде используется частичная индексация строки , здесь используется DataFrame.loc

prices = pd.DataFrame()
for year in ['2013', '2014', '2015']:
    s = price_per_year['price'][year].reset_index(drop=True).rename(year)
    prices = pd.concat([prices, s], axis=1)
print (prices)
    2013   2014   2015
0  20.08  19.86  19.66
1  19.78  19.40  19.66

Другое лучшее решение с изменением формы:

print (df)
            price
date             
2013-01-02  20.08
2013-01-03  19.78
2014-01-02  19.86
2014-01-03  19.40
2015-01-02  19.66
2015-01-03  19.66

y = df.index.year
df = df.set_index([df.groupby(y).cumcount(), y])['price'].unstack()
print (df)
date   2013   2014   2015
0     20.08  19.86  19.66
1     19.78  19.40  19.66
...