Velg DataFrame-rader mellom to datoer

Jeg oppretter en DataFrame fra en csv-fil på følgende måte:

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

DataFrame har en datakolonne. Er det mulig å opprette en ny DataFrame (eller bare overskrive den eksisterende) som bare inneholder rader med datoverdier som faller innenfor et spesifisert datointervall eller mellom to spesifiserte datoverdier?

Løsning

Det finnes to mulige løsninger:

  • Bruk en boolsk maske, og bruk deretter df.loc[mask].
  • Angi datakolonnen som en DatetimeIndex, og bruk deretter df[start_date : end_date].

Bruke en boolsk maske:

Kontroller at df['date'] er en serie med dtype datetime64[ns]:

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

Lag en boolsk maske. start_date og end_date kan være datetime.datetime, np.datetime64, pd.Timestamp eller til og med datetime-strenger:


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

Jeg tror det beste alternativet vil være å bruke de direkte kontrollene i stedet for å bruke loc-funksjonen:


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

Du kan bruke metoden isin på kolonnen date på følgende måte df[df["dato"].isin(pd.date_range(start_date, end_date))]

Note: Dette fungerer bare med datoer (som spørsmålet spør om) og ikke tidsstempler.

Eksempel:

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

som gir

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