Filtrando DataFrames do Pandas nas datas

157

Eu tenho um DataFrame do Pandas com uma coluna 'date'. Agora eu preciso filtrar todas as linhas no DataFrame que tenham datas fora dos próximos dois meses. Essencialmente, só preciso reter as linhas que estão dentro dos próximos dois meses.

Qual a melhor maneira de alcançar isto?

AMM
fonte

Respostas:

238

Se a coluna da data for o índice , use .loc para indexação baseada em rótulo ou .iloc para indexação posicional.

Por exemplo:

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

Veja detalhes aqui http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Se a coluna não for o índice, você tem duas opções:

  1. Torne o índice (temporário ou permanentemente, se forem dados de séries temporais)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

Veja aqui a explicação geral

Nota: .ix está obsoleto.

Retozi
fonte
4
Obrigado, vai ler. A data é uma coluna separada e não o índice no meu caso. Eu provavelmente deveria ter dado essa informação em primeiro lugar. MINHA pergunta não foi muito informativa.
AMR
42
Você pode usar queryaqui também. df.query('20130101 < date < 20130201').
Phillip Cloud
10
Você deve mencionar que os filtros para índice (via .loce .ix) e colunas em seus exemplos não são equivalentes. df.ix['2014-01-01':'2014-02-01']inclui 2014-02-01while df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]não inclui 2013-02-01, ele corresponderá apenas às linhas até 2013-01-31.
Rafael Barbosa
4
Esta chamada foi descontinuada agora!
Mohamed Taher Alrefaie
6
E se alguém não quiser filtrar um período, mas várias vezes?
Salem Ben Mabrouk
53

Resposta anterior não está correta na minha experiência, você não pode passar uma string simples, precisa ser um objeto datetime. Assim:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]
orange1
fonte
16
Posso absolutamente passar uma string sem problemas.
Ninjakannon
9
ix indexador é obsoleto, o uso loc - pandas.pydata.org/pandas-docs/stable/...
Nick
3
pandas irá converter qualquer "datetime" string em um objeto datetime .. por isso é correto
janscas
8
Eu recebo o seguinte erro usando este: TypeError: '<' não é suportado entre instâncias do 'int' e 'datetime.date'
Haris Khaliq
41

E se suas datas forem padronizadas importando o pacote datetime, você pode simplesmente usar:

df[(df['date']>datetime.date(2016,1,1)) & (df['date']<datetime.date(2016,3,1))]  

Para padronizar sua sequência de datas usando o pacote datetime, você pode usar esta função:

import datetime
datetime.datetime.strptime
shm2008
fonte
5
É recomendável usar df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))].
Então S
20

Se sua coluna datetime tiver o tipo de data e hora do Pandas (por exemplo datetime64[ns]), para uma filtragem adequada, você precisará do objeto pd.Timestamp , por exemplo:

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]
VMAtm
fonte
14

Se as datas estiverem no índice, simplesmente:

df['20160101':'20160301']
fantabolous
fonte
7

Você pode usar o pd.Timestamp para executar uma consulta e uma referência local

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")')

com a saída

                 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

Dê uma olhada na documentação do DataFrame.query do pandas , especificamente na menção sobre o @prefixo de udsing referenciado por variáveis ​​locais . Nesse caso, fazemos referência ao pd.Timestampuso do alias local tspara poder fornecer uma string de carimbo de data / hora

danielhrisca
fonte
Você poderia passar um link para a documentação das funções @ts?
Glen Moutrie
6

Portanto, ao carregar o arquivo de dados csv, precisaremos definir a coluna da data como índice agora como abaixo, para filtrar os dados com base em um intervalo de datas. Isso não era necessário para o método agora descontinuado: pd.DataFrame.from_csv ().

Se você deseja apenas mostrar os dados por dois meses de janeiro a fevereiro, por exemplo, 2020-01-01 a 2020-02-29, é possível:

import pandas as pd
mydata = pd.read_csv('mydata.csv',index_col='date') # or its index number, e.g. index_col=[0]
mydata['2020-01-01':'2020-02-29'] # will pull all the columns
#if just need one column, e.g. Cost, can be done:
mydata['2020-01-01':'2020-02-29','Cost'] 

Isso foi testado para o Python 3.7. Espero que você ache isso útil.

atormentar
fonte
1
index_coltem que ser stringuma lista não. mydata = pd.read_csv('mydata.csv',index_col='date')
Sharl Sherif 16/04
5

Que tal usar pyjanitor

Possui recursos interessantes.

Depois de pip install pyjanitor

import janitor

df_filtered = df.filter_date(your_date_column_name, start_date, end_date)
pakira79
fonte
2

A maneira mais curta de filtrar seu quadro de dados por data: suponha que sua coluna de data seja do tipo datetime64 [ns]

# filter by single day
df = df[df['date'].dt.strftime('%Y-%m-%d') == '2014-01-01']

# filter by single month
df = df[df['date'].dt.strftime('%Y-%m') == '2014-01']

# filter by single year
df = df[df['date'].dt.strftime('%Y') == '2014']
Ekrem Gurdal
fonte
1

Ainda não tenho permissão para escrever comentários, por isso vou escrever uma resposta, se alguém ler todos eles e chegar a esse.

Se o índice do conjunto de dados for um datetime e você desejar filtrá-lo apenas por (por exemplo) meses, poderá fazer o seguinte:

df.loc[df.index.month = 3]

Isso filtrará o conjunto de dados para você em março.

uhetz
fonte
1

Se você já converteu a string para um formato de data usando pd.to_datetime, basta usar:

df = df[(df['Date']> "2018-01-01") & (df['Date']< "2019-07-01")]

Jerin Mathew
fonte
0

Você pode selecionar o intervalo de tempo fazendo: df.loc ['start_date': 'end_date']

Ernesto Lopez Fune
fonte