Selecteer DataFrame rijen tussen twee datums

Ik maak een DataFrame van een csv als volgt:

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

De DataFrame heeft een datum kolom. Is er een manier om een nieuw DataFrame te maken (of gewoon het bestaande DataFrame te overschrijven) dat alleen rijen bevat met datumwaarden die binnen een gespecificeerd datumbereik vallen of tussen twee gespecificeerde datumwaarden?

Oplossing

Er zijn twee mogelijke oplossingen:

  • Gebruik een booleaans masker, gebruik dan df.loc[masker]
  • Stel de datum kolom in als een DatetimeIndex, gebruik dan df[start_date : end_date]

Gebruik een boolean mask:

Zorg ervoor dat df['date'] een Serie is met dtype datetime64[ns]:

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

Maak een booleaans masker. start_datum en eind_datum kunnen datetime.datetimes zijn, np.datetime64s, pd.Timestamps, of zelfs datetime strings:


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

Ik denk dat de beste optie zal zijn om de directe controles te gebruiken in plaats van de loc-functie:


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

U kunt de isin methode gebruiken op de datum kolom als volgt df[df["date"].isin(pd.date_range(start_date, end_date))]

Note: Dit werkt alleen met datums (zoals de vraag vraagt) en niet met timestamps.

Voorbeeld:

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

dat geeft

           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
Commentaren (0)