Выберите диапазон строк DatetimeIndex, используя.loc (Pandas Python 3)

Работа с сериями панд с DatetimeIndex. Желаемый результат - это кадр данных, содержащий все строки в диапазоне, указанном в функции.loc[].

Когда я пытаюсь следующий код:

aapl.index = pd.to_datetime(aapl.index)
print(aapl.loc[pd.Timestamp('2010-11-01'):pd.Timestamp('2010-12-30')])

Я вернулся:

Empty DataFrame
Columns: [Open, High, Low, Close, Volume, ExDividend, SplitRatio, 
AdjOpen, AdjHigh, AdjLow, AdjClose, AdjVolume]
Index: []

Просто повторюсь, мой желаемый результат - это подмножество фрейма данных, содержащее все строки в пределах диапазона (2010-11-01):(2010-12-30).

3 ответа

Похоже, вам нужно конвертировать ваш индекс в datetime, затем используйте стандартную запись индексации / нарезки.

import pandas as pd, numpy as np

df = pd.DataFrame(list(range(365)))

# these lines are for demonstration purposes only
df['date'] = pd.date_range('2010-1-1', periods=365, freq='D').astype(str)
df = df.set_index('date')

df.index = pd.to_datetime(df.index)

res = df[pd.Timestamp('2010-11-01'):pd.Timestamp('2010-11-10')]

#               0
# date           
# 2010-11-01  304
# 2010-11-02  305
# 2010-11-03  306
# 2010-11-04  307
# 2010-11-05  308
# 2010-11-06  309
# 2010-11-07  310
# 2010-11-08  311
# 2010-11-09  312
# 2010-11-10  313

IIUC:

import pandas_datareader as web
aapl = web.get_data_yahoo('aapl')

aapl.loc['2010-11-01':'2010-12-30']

Использование частичной индексации строк и нарезки.

Из любопытства я попытался указать самую последнюю дату в качестве начала выбора, а менее последнюю - в качестве конца. К моему удивлению это сработало, но данные временного ряда были в обратном порядке.

В:

aapl.loc[pd.Timestamp('2010-12-30'):pd.Timestamp('2010-11-01')]

Итак... я понял, что мои данные Timeseries должны быть в обратном порядке. Теперь возникает вопрос, как мне отсортировать DatetimeIndex DF в правильном порядке?

Желаемый порядок будет иметь n-ую дату в качестве последней строки и самую раннюю дату в качестве первой строки.

******РЕДАКТИРОВАТЬ******

aapl.index = pd.to_datetime(aapl.index)
aapl =  aapl.sort_index(ascending=True)

aaplrange = aapl.loc[pd.Timestamp('2010-11-01'):pd.Timestamp('2010-12-30')]

Работает!

Другие вопросы по тегам