DataFrame-Zeilen zwischen zwei Daten auswählen

Ich erstelle einen DataFrame aus einer csv-Datei wie folgt:

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

Der DataFrame hat eine Datumsspalte. Gibt es eine Möglichkeit, einen neuen DataFrame zu erstellen (oder einfach den vorhandenen zu überschreiben), der nur Zeilen mit Datumswerten enthält, die in einen bestimmten Datumsbereich oder zwischen zwei bestimmte Datumswerte fallen?

Lösung

Es gibt zwei mögliche Lösungen:

  • Verwenden Sie eine boolesche Maske und dann df.loc[mask]
  • Setzen Sie die Datumsspalte als DatetimeIndex, dann verwenden Sie df[start_date : end_date]

Verwendung einer booleschen Maske:

Stellen Sie sicher, dass df['date'] eine Serie mit dem Typ datetime64[ns] ist:

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

Erstelle eine boolesche Maske. start_dateundend_datekönnendatetime.datetimesein, np.datetime64,pd.Timestamp`, oder auch datetime-Strings sein:


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

Meiner Meinung nach ist es am besten, die Direktprüfungen zu nutzen, anstatt die Loc-Funktion zu verwenden:


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

Sie können die Methode "isin" für die Spalte "date" wie folgt verwenden df[df["Datum"].isin(pd.date_range(start_date, end_date))]`

Anmerkung: Dies funktioniert nur mit Datumsangaben (wie in der Frage gefordert) und nicht mit Zeitstempeln.

Beispiel:

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

Das ergibt

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