Respostas:
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:
df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]
Veja aqui a explicação geral
Nota: .ix está obsoleto.
query
aqui também. df.query('20130101 < date < 20130201')
.
.loc
e .ix
) e colunas em seus exemplos não são equivalentes. df.ix['2014-01-01':'2014-02-01']
inclui 2014-02-01
while 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
.
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)]
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
df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))]
.
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]
Se as datas estiverem no índice, simplesmente:
df['20160101':'20160301']
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.Timestamp
uso do alias local ts
para poder fornecer uma string de carimbo de data / hora
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.
index_col
tem que ser string
uma lista não. mydata = pd.read_csv('mydata.csv',index_col='date')
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']
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.
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")]
Você pode selecionar o intervalo de tempo fazendo: df.loc ['start_date': 'end_date']