Sélectionner les lignes de DataFrame entre deux dates

Je crée un DataFrame à partir d'un csv comme suit :

stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)

Le DataFrame comporte une colonne date. Existe-t-il un moyen de créer un nouveau DataFrame (ou simplement d'écraser le DataFrame existant) qui ne contient que les lignes dont les valeurs de date sont comprises dans une plage de dates spécifiée ou entre deux valeurs de date spécifiées ?

Solution

Il y a deux solutions possibles :

  • Utilisez un masque booléen, puis utilisez df.loc[mask].
  • Définissez la colonne de date comme un DatetimeIndex, puis utilisez df[start_date : end_date].

Utilisation d'un masque booléen :

Assurez-vous que df['date&#39 ;] est une série avec le dtype datetime64[ns] :

df['date'] = pd.to_datetime(df['date'])  

Créez un masque booléen. start_date et end_date peuvent être datetime.datetimes, np.datetime64s, pd.Timestamps, ou même des chaînes de dates :


#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date']  '2000-6-1&#39 ;) &amp ; (df['date&#39 ;] 
Commentaires (6)

Je pense que la meilleure option sera d'utiliser les contrôles directs plutôt que d'utiliser la fonction loc :


df = df[(df['date'] > '2000-6-1') & (df['date'] 
Commentaires (2)

Vous pouvez utiliser la méthode isin sur la colonne date comme suit `df[df["date&quot ;].isin(pd.date_range(start_date, end_date))]``

Note: Cela ne fonctionne qu'avec les dates (comme le demande la question) et non avec les timestamps.

Exemple:

import numpy as np   
import pandas as pd

# Make a DataFrame with dates and random numbers
df = pd.DataFrame(np.random.random((30, 3)))
df['date'] = pd.date_range('2017-1-1', periods=30, freq='D')

# Select the rows between two dates
in_range_df = df[df["date"].isin(pd.date_range("2017-01-15", "2017-01-20"))]

print(in_range_df)  # print result

ce qui donne

           0         1         2       date
14  0.960974  0.144271  0.839593 2017-01-15
15  0.814376  0.723757  0.047840 2017-01-16
16  0.911854  0.123130  0.120995 2017-01-17
17  0.505804  0.416935  0.928514 2017-01-18
18  0.204869  0.708258  0.170792 2017-01-19
19  0.014389  0.214510  0.045201 2017-01-20
Commentaires (0)