Επιλογή γραμμών DataFrame μεταξύ δύο ημερομηνιών

Δημιουργώ ένα DataFrame από ένα csv ως εξής:

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

Το DataFrame έχει μια στήλη ημερομηνίας. Υπάρχει τρόπος να δημιουργήσω ένα νέο DataFrame (ή απλά να αντικαταστήσω το υπάρχον) το οποίο να περιέχει μόνο γραμμές με τιμές ημερομηνίας που εμπίπτουν σε ένα καθορισμένο εύρος ημερομηνίας ή μεταξύ δύο καθορισμένων τιμών ημερομηνίας;

Λύση

Υπάρχουν δύο πιθανές λύσεις:

  • loc[mask]`
  • Ορίστε τη στήλη ημερομηνίας ως DatetimeIndex, στη συνέχεια χρησιμοποιήστε df[start_date : end_date]

Χρησιμοποιώντας μια μάσκα boolean:

Βεβαιωθείτε ότι df['date'] είναι μια σειρά με τύπο dtype datetime64[ns]:

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

Κάντε μια μάσκα boolean. Οι ημερομηνίες start_date και end_date μπορούν να είναι datetime.datetime, np.datetime64s, pd.Timestamps, ή ακόμη και συμβολοσειρές datetime:


#greater than the start date and smaller than the end date
mask = (df['date'] > start_date) & (df['date']  '2000-6-1') & (df['date'] 
Σχόλια (6)

Θεωρώ ότι η καλύτερη επιλογή θα είναι να χρησιμοποιήσετε τους άμεσους ελέγχους αντί να χρησιμοποιήσετε τη λειτουργία loc:


df = df[(df['date'] > '2000-6-1') & (df['date'] 
Σχόλια (2)

Μπορείτε να χρησιμοποιήσετε τη μέθοδο isin στη στήλη date ως εξής df[df["date"].isin(pd.date_range(start_date, end_date))]

Σημείωση: Αυτό λειτουργεί μόνο με ημερομηνίες (όπως ζητάει η ερώτηση) και όχι με χρονοσφραγίδες.

Παράδειγμα:

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

το οποίο δίνει

           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
Σχόλια (0)