Подтвердить что ты не робот

Фильтрация данных по фреймам Pandas по датам

У меня есть Pandas DataFrame со столбцом "дата". Теперь мне нужно отфильтровать все строки в DataFrame с датами за пределами следующих двух месяцев. По сути, мне нужно только сохранить строки, которые находятся в течение следующих двух месяцев.

Каков наилучший способ достичь этого?

4b9b3361

Ответ 1

Если столбец даты является индексом, используйте .loc для индексирования на основе меток или .iloc для позиционной индексации.

Например:

df.loc['2014-01-01':'2014-02-01']

Подробности смотрите здесь http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Если столбец не является индексом, у вас есть два варианта:

  1. Сделать это индексом (временно или постоянно, если это данные временных рядов)
  2. 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