Filtrado de marcos de datos de pandas en fechas

157

Tengo un Pandas DataFrame con una columna 'fecha'. Ahora necesito filtrar todas las filas en el DataFrame que tienen fechas fuera de los próximos dos meses. Esencialmente, solo necesito retener las filas que están dentro de los próximos dos meses.

¿Cuál es la mejor manera de lograr esto?

AMM
fuente

Respuestas:

238

Si la columna de fecha es el índice , utilice .loc para la indexación basada en etiquetas o .iloc para la indexación posicional.

Por ejemplo:

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

Ver detalles aquí http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Si la columna no es el índice , tiene dos opciones:

  1. Conviértalo en el índice (ya sea temporal o permanentemente si se trata de datos de series temporales)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

Vea aquí la explicación general.

Nota: .ix está en desuso.

Retozi
fuente
44
Gracias, lo leeré. La fecha es una columna separada y no el índice en mi caso. Probablemente debería haber dado esa información en primer lugar. MI pregunta no fue muy informativa.
AMM
42
Puedes usar queryaquí también. df.query('20130101 < date < 20130201').
Phillip Cloud
10
Debe mencionar que los filtros para el índice (vía .locy .ix) y las columnas en sus ejemplos no son equivalentes. df.ix['2014-01-01':'2014-02-01']incluye 2014-02-01mientras df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]que no incluye 2013-02-01, solo coincidirá con filas de hasta 2013-01-31.
Rafael Barbosa
44
Esta llamada está en desuso ahora!
Mohamed Taher Alrefaie
66
¿Qué pasa si uno no quiere filtrar en un rango de fechas, sino en varias fechas y horas?
Salem Ben Mabrouk
53

La respuesta anterior no es correcta en mi experiencia, no puede pasarle una cadena simple, debe ser un objeto de fecha y hora. Entonces:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]
naranja1
fuente
16
Absolutamente puedo pasar una cadena sin problemas.
Ninjakannon
9
ix indexer está en desuso, use loc - pandas.pydata.org/pandas-docs/stable/…
Nick
3
pandas convertir cualquier "fecha y hora" cadena en un objeto de fecha y hora .. por lo que es correcto
janscas
8
Recibo el siguiente error al usar esto: TypeError: '<' no es compatible entre instancias de 'int' y 'datetime.date'
Haris Khaliq
41

Y si sus fechas están estandarizadas al importar el paquete datetime, simplemente puede usar:

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

Para estandarizar su cadena de fecha usando el paquete datetime, puede usar esta función:

import datetime
datetime.datetime.strptime
shm2008
fuente
55
Se recomienda su uso df[(df['date']>pd.Timestamp(2016,1,1)) & (df['date']<pd.Timestamp(2016,3,1))].
Entonces, S
20

Si su columna de fecha y hora tiene el tipo de fecha y hora de Pandas (p datetime64[ns]. Ej. ), Para un filtrado adecuado necesita el objeto pd.Timestamp , por ejemplo:

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
fuente
14

Si las fechas están en el índice, simplemente:

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

Puede usar pd.Timestamp para realizar una consulta y una referencia 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")')

con la salida

                 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

Eche un vistazo a la documentación de pandas para DataFrame.query , específicamente la mención sobre el @prefijo de udsing referenciado de variable local . En este caso, hacemos referencia al pd.Timestampuso del alias local tspara poder proporcionar una cadena de marca de tiempo

danielhrisca
fuente
¿Podría pasar un enlace para la documentación de las funciones @ts?
Glen Moutrie
6

Entonces, al cargar el archivo de datos csv, necesitaremos establecer la columna de fecha como índice ahora como se muestra a continuación, para filtrar los datos en función de un rango de fechas. Esto no era necesario para el método ahora obsoleto: pd.DataFrame.from_csv ().

Si solo desea mostrar los datos durante dos meses de enero a febrero, por ejemplo, 2020-01-01 a 2020-02-29, puede hacerlo:

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'] 

Esto ha sido probado trabajando para Python 3.7. Espero que encuentres esto útil.

Harry
fuente
1
index_coltiene que ser una stringno una lista. mydata = pd.read_csv('mydata.csv',index_col='date')
Sharl Sherif
5

¿Qué tal usar pyjanitor

Tiene características geniales.

Después pip install pyjanitor

import janitor

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

La forma más corta de filtrar su marco de datos por fecha: supongamos que su columna de fecha es el tipo de fecha y hora64 [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
fuente
1

Todavía no tengo permitido escribir ningún comentario, así que escribiré una respuesta, si alguien los lee todos y llega a este.

Si el índice del conjunto de datos es una fecha y hora y desea filtrarlo solo por (por ejemplo) meses, puede hacer lo siguiente:

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

Eso filtrará el conjunto de datos en marzo.

Uhetz
fuente
1

Si ya ha convertido la cadena a un formato de fecha usando pd.to_datetime, puede usar:

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

Jerin Mathew
fuente
0

Puede seleccionar el rango de tiempo haciendo: df.loc ['start_date': 'end_date']

Ernesto Lopez Fune
fuente