Vælg DataFrame-rækker mellem to datoer

Jeg opretter et DataFrame fra en csv på følgende måde:

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

DataFrame har en dato kolonne. Er der en måde at oprette et nyt DataFrame (eller bare overskrive det eksisterende), som kun indeholder rækker med datoværdier, der falder inden for et bestemt datointerval eller mellem to bestemte datoværdier?

Løsning

Der er to mulige løsninger:

  • Brug en boolsk maske, og brug derefter df.loc[mask].
  • Indstil dato-kolonnen som et DatetimeIndex, og brug derefter df[start_date : end_date].

Anvendelse af en boolsk maske:

Sørg for, at df['date'] er en Series med dtype datetime64[ns]:

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

Lav en boolsk maske. start_date og end_date kan være datetime.datetimes, np.datetime64s, pd.Timestamps, eller endog datotidsstrenge:


#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 mener, at den bedste løsning vil være at bruge de direkte kontroller i stedet for at bruge loc-funktionen:


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

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

Bemærkning: Dette virker kun med datoer (som spørgsmålet spørger) og ikke med 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 giver

           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)