web-dev-qa-db-fra.com

Filtrage Pandas _ DataFrames sur les dates

J'ai un Pandas DataFrame avec une colonne 'date'. Maintenant, je dois filtrer toutes les lignes du DataFrame dont la date est en dehors des deux prochains mois. Pour l’essentiel, il me suffit de conserver les lignes qui se trouvent dans les deux prochains mois.

Quel est le meilleur moyen d'y parvenir?

105
AMM

Si la colonne de date est l'index , utilisez alors .loc pour l'indexation basée sur une étiquette ou .iloc pour l'indexation positionnelle.

Par exemple:

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

Voir les détails ici http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

Si la colonne est et non l'index , vous avez deux choix:

  1. Faites-en l'index (temporairement ou définitivement s'il s'agit de données chronologiques)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

Voir ici pour l'explication générale

Remarque: .ix est obsolète.

170
Retozi

La réponse précédente n'est pas correcte dans mon expérience, vous ne pouvez pas lui passer une chaîne simple, il faut que ce soit un objet datetime. Alors:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]
34
orange1

Et si vos dates sont normalisées en important un package datetime, vous pouvez simplement utiliser:

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

Pour standardiser votre chaîne de date à l'aide du package datetime, vous pouvez utiliser cette fonction:

import datetime
datetime.datetime.strptime
27
shm2008

Si votre colonne datetime a le type Pandas datetime (par exemple datetime64[ns]), vous avez besoin du objet pd.Timestamp , par exemple:

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

Si les dates sont dans l'index, alors simplement:

df['20160101':'20160301']
10
fantabolous

Vous pouvez utiliser pd.Timestamp pour effectuer une requête et une référence locale

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

avec la sortie

                 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
1
danielhrisca