подмножество панд DataFrame на основе времени - PullRequest
0 голосов
/ 15 октября 2018

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

date_format = '%Y-%m-%d'  
window_start = datetime.strptime('2000-01-01', date_format)  
window_end = datetime.strptime('2010-12-31', date_format)  
subs_df = pandas.DataFrame(index=np.arange(0, 0),   
                      columns = list(orig_df.columns))  

for i, row in orig_df.iterrows():  
    date = datetime.strptime(row.time, date_format)  
    f date >= window_start and date <= window_end:  
        subs_df = subs_df.append(row, ignore_index=True)  

Это очень медленно.У меня такое чувство, что я делаю что-то в корне неправильно.Что может быть лучше для этого?

Спасибо за ваше время.

1 Ответ

0 голосов
/ 15 октября 2018

Да, это будет медленно.Вот несколько указателей:

  • С Pandas избегайте петель уровня for уровня Python.Вы можете использовать логическое индексирование и, поскольку серии Pandas datetime хранятся внутри как целые числа, в этом используется преимущество векторизации.
  • Избегайте встроенных в Python объектов datetime с Pandas.Вместо этого используйте pd.Timestamp объекты.Часто строк достаточно, поскольку это преобразование происходит внутри.
  • Избегайте любой ценой использования pd.DataFrame.append в цикле.Это дорогостоящая операция, поскольку она включает в себя ненужное копирование данных.

Вот пример того, что вы можете сделать:

# convert series to Pandas datetime
orig_df['time'] = pd.to_datetime(orig_df['time'])

# construct Boolean mask
mask = orig_df['time'].between('2000-01-01', '2010-12-31')

# apply Boolean mask
new_df = orig_df[mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...