Фильтрация данных по фреймам Pandas по датам
У меня есть Pandas DataFrame со столбцом "дата". Теперь мне нужно отфильтровать все строки в DataFrame с датами за пределами следующих двух месяцев. По сути, мне нужно только сохранить строки, которые находятся в течение следующих двух месяцев.
Каков наилучший способ достичь этого?
Ответы
Ответ 1
Если столбец даты является индексом, используйте .loc для индексирования на основе меток или .iloc для позиционной индексации.
Например:
df.loc['2014-01-01':'2014-02-01']
Подробности смотрите здесь http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection
Если столбец не является индексом, у вас есть два варианта:
- Сделать это индексом (временно или постоянно, если это данные временных рядов)
-
df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]
Смотрите здесь для общего объяснения
Примечание:.ix устарела.
Ответ 2
Предыдущий ответ, по моему опыту, неверен, вы не можете передать его простой строкой, он должен быть объектом datetime. Так:
import datetime
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]
Ответ 3
И если ваши даты стандартизованы путем импорта пакета datetime, вы можете просто использовать:
df[(df['date']>datetime.date(2016,1,1)) & (df['date']<datetime.date(2016,3,1))]
Для стандартизации строки даты, использующей пакет datetime, вы можете использовать эту функцию:
import datetime
datetime.datetime.strptime
Ответ 4
Если ваш столбец datetime имеет тип datetime Pandas (например, datetime64[ns]
), для правильной фильтрации вам понадобится объект pd.Timestamp, например:
from datetime import date
import pandas as pd
value_to_check = pd.Timestamp(date.today().year, 1, 1)
filter_mask = df['date_column'] < value_to_check
filtered_df = df[filter_mask]
Ответ 5
Если даты указаны в индексе, просто:
df['20160101':'20160301']
Ответ 6
Вы можете использовать pd.Timestamp для выполнения запроса и локальной ссылки
import pandas as pd
import numpy as np
df = pd.DataFrame()
ts = pd.Timestamp
df['date'] = np.array(np.arange(10) + datetime.now().timestamp(), dtype='M8[s]')
print(df)
print(df.query('date > @ts("20190515T071320")')
с выходом
date
0 2019-05-15 07:13:16
1 2019-05-15 07:13:17
2 2019-05-15 07:13:18
3 2019-05-15 07:13:19
4 2019-05-15 07:13:20
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25
date
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25