Il y a deux solutions possibles:
- Utilisez un masque booléen, puis utilisez
df.loc[mask]
- Définissez la colonne de date comme DatetimeIndex, puis utilisez
df[start_date : end_date]
Utilisation d'un masque booléen :
S'assurer df['date']est une série avec dtype datetime64[ns]:
df['date'] = pd.to_datetime(df['date'])
Faites un masque booléen. start_dateet end_datepeut être datetime.datetimes,
np.datetime64s, pd.Timestamps ou même des chaînes datetime:
#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date'] <= end_date)
Sélectionnez le sous-DataFrame:
df.loc[mask]
ou réattribuer à df
df = df.loc[mask]
Par exemple,
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((200,3)))
df['date'] = pd.date_range('2000-1-1', periods=200, freq='D')
mask = (df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')
print(df.loc[mask])
rendements
0 1 2 date
153 0.208875 0.727656 0.037787 2000-06-02
154 0.750800 0.776498 0.237716 2000-06-03
155 0.812008 0.127338 0.397240 2000-06-04
156 0.639937 0.207359 0.533527 2000-06-05
157 0.416998 0.845658 0.872826 2000-06-06
158 0.440069 0.338690 0.847545 2000-06-07
159 0.202354 0.624833 0.740254 2000-06-08
160 0.465746 0.080888 0.155452 2000-06-09
161 0.858232 0.190321 0.432574 2000-06-10
Utilisation d'un DatetimeIndex :
Si vous comptez effectuer de nombreuses sélections par date, il peut être plus rapide de définir d'abord la
datecolonne comme index. Ensuite, vous pouvez sélectionner des lignes par date en utilisant
df.loc[start_date:end_date].
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random((200,3)))
df['date'] = pd.date_range('2000-1-1', periods=200, freq='D')
df = df.set_index(['date'])
print(df.loc['2000-6-1':'2000-6-10'])
rendements
0 1 2
date
2000-06-01 0.040457 0.326594 0.492136 # <- includes start_date
2000-06-02 0.279323 0.877446 0.464523
2000-06-03 0.328068 0.837669 0.608559
2000-06-04 0.107959 0.678297 0.517435
2000-06-05 0.131555 0.418380 0.025725
2000-06-06 0.999961 0.619517 0.206108
2000-06-07 0.129270 0.024533 0.154769
2000-06-08 0.441010 0.741781 0.470402
2000-06-09 0.682101 0.375660 0.009916
2000-06-10 0.754488 0.352293 0.339337
Alors que l'indexation de liste Python, par exemple seq[start:end]inclut startmais pas end, en revanche, Pandas df.loc[start_date : end_date]inclut les deux points d'extrémité dans le résultat s'ils sont dans l'index. Cependant, ni l'un start_dateni l' autre ne end_datedoivent figurer dans l'index.
Notez également que pd.read_csvpossède un parse_datesparamètre que vous pouvez utiliser pour analyser la datecolonne en tant que datetime64s. Ainsi, si vous utilisez parse_dates, vous n'aurez pas besoin d'utiliser df['date'] = pd.to_datetime(df['date']).