2017-02-28 3 views
1

ich Pandas DF haben, die wie folgt aussieht:Filtering Pandas Datenrahmen auf der letzten n Daten

df

ich die DF mit einem lokal definierten int Parameter gefiltert werden soll, 'Tage'. Wie zum Beispiel, wenn Tage = 10 sind, hat mein gefilterter DF nur die Daten für die letzten verfügbaren 10 Daten.

Bisher habe ich versucht, die folgenden:

days=10  
cutoff_date = df["SeriesDate"][-1:] - datetime.timedelta(days=days) 

jedoch dann zur Ausgabe versucht, die gefilterte DF mit:

df[df['SeriesDate'] > cutoff_date] 

ich die follwing Fehler:

ValueError: Can only compare identically-labeled Series objects 

Ich lerne immer noch Python und schätze jede Hilfe, die ich damit bekommen kann.

+0

nicht sicher, ob ich verstehe Ihre Frage: Sie müssen zuerst eine erstellen Cut-Off-Datum für jede Zeile und dann entsprechend filtern? – lorenzori

+0

Ich möchte den DF gefiltert nach dem in Tagen übergebenen Wert ausgeben. Geben Sie also die letzten 10 Werte im DF aus, wenn Tage = 10. Wenn also das letzte verfügbare Datum der 27. Februar 2017 ist, sollte meine Ausgabeserie nur Werte nach dem 17. Februar 2017 haben. – sg91

+0

Ist Ihr Dataframe-Index nach Datum? Es hilft, wenn Sie ein Beispiel Ihrer Daten veröffentlichen. –

Antwort

1

Ich glaube, Sie letzten Wert der Spalte SeriesDate von iloc wählen müssen:

start = pd.to_datetime('2015-02-24') 
rng = pd.date_range(start, periods=15, freq='20H') 
df = pd.DataFrame({'SeriesDate': rng, 'Value_1': np.random.random(15)}) 
print (df) 
      SeriesDate Value_1 
0 2015-02-24 00:00:00 0.849160 
1 2015-02-24 20:00:00 0.332487 
2 2015-02-25 16:00:00 0.687638 
3 2015-02-26 12:00:00 0.310326 
4 2015-02-27 08:00:00 0.660795 
5 2015-02-28 04:00:00 0.354475 
6 2015-03-01 00:00:00 0.061312 
7 2015-03-01 20:00:00 0.443908 
8 2015-03-02 16:00:00 0.708326 
9 2015-03-03 12:00:00 0.257419 
10 2015-03-04 08:00:00 0.618363 
11 2015-03-05 04:00:00 0.121625 
12 2015-03-06 00:00:00 0.637324 
13 2015-03-06 20:00:00 0.058292 
14 2015-03-07 16:00:00 0.047624 
days=10  
cutoff_date = df["SeriesDate"].iloc[-1] - pd.Timedelta(days=days) 
print (cutoff_date) 
2015-02-25 16:00:00 

df1 = df[df['SeriesDate'] > cutoff_date] 
print (df1) 
      SeriesDate Value_1 
3 2015-02-26 12:00:00 0.310326 
4 2015-02-27 08:00:00 0.660795 
5 2015-02-28 04:00:00 0.354475 
6 2015-03-01 00:00:00 0.061312 
7 2015-03-01 20:00:00 0.443908 
8 2015-03-02 16:00:00 0.708326 
9 2015-03-03 12:00:00 0.257419 
10 2015-03-04 08:00:00 0.618363 
11 2015-03-05 04:00:00 0.121625 
12 2015-03-06 00:00:00 0.637324 
13 2015-03-06 20:00:00 0.058292 
14 2015-03-07 16:00:00 0.047624 

Eine weitere Alternative ist die Verwendung max dank Pocin:

cutoff_date = df["SeriesDate"].max() - pd.Timedelta(days=days) 
print (cutoff_date) 
2015-02-25 16:00:00 

Und wenn Sie wollen Filter von dates nur:

days=10  
cutoff_date = df["SeriesDate"].dt.date.iloc[-1] - pd.Timedelta(days=days) 
print (cutoff_date) 
2015-02-25 

EDIT:

Sie können Termine herauszufiltern, wo ist Wochenende mit dayofweek und verwenden Sie dann isin

start = pd.to_datetime('2015-02-24') 
rng = pd.date_range(start, periods=15) 
df = pd.DataFrame({'SeriesDate': rng, 'Value_1': np.random.random(15)}) 
print (df) 
    SeriesDate Value_1 
0 2015-02-24 0.498387 
1 2015-02-25 0.435767 
2 2015-02-26 0.299233 
3 2015-02-27 0.489286 
4 2015-02-28 0.892167 
5 2015-03-01 0.507436 
6 2015-03-02 0.360427 
7 2015-03-03 0.903886 
8 2015-03-04 0.718148 
9 2015-03-05 0.645489 
10 2015-03-06 0.251285 
11 2015-03-07 0.139275 
12 2015-03-08 0.756845 
13 2015-03-09 0.565863 
14 2015-03-10 0.148077 
days=10  
last_day = df["SeriesDate"].dt.date.iloc[-1] 
cutoff_date = last_day - pd.Timedelta(days=days) 
rng = pd.date_range(cutoff_date, last_day) 

rng = rng[(rng.dayofweek != 0) & (rng.dayofweek != 6)] 
print (rng) 
DatetimeIndex(['2015-02-28', '2015-03-03', '2015-03-04', '2015-03-05', 
       '2015-03-06', '2015-03-07', '2015-03-10'], 
       dtype='datetime64[ns]', freq=None) 

df1 = df[df['SeriesDate'].isin(rng)] 
print (df1) 
    SeriesDate Value_1 
4 2015-02-28 0.892167 
7 2015-03-03 0.903886 
8 2015-03-04 0.718148 
9 2015-03-05 0.645489 
10 2015-03-06 0.251285 
11 2015-03-07 0.139275 
14 2015-03-10 0.148077 
+1

statt auf den Datetime-Index zu sortieren und mit 'iloc [-1]', mit 'df ['SeriesDate'] zu verwenden. Max()' könnte praktikable Alternative sein –

+0

Danke beide, ist es möglich, an cutoff_date damit zu gelangen Es ignoriert Wochenenddaten? Das heißt, wenn Tage = 10, ist cutoff_date das 10-Tage-Datum, das Wochenenden ignoriert. Das sind nur Arbeitstage. – sg91

+0

@ sg91 - Bitte überprüfen Sie die letzte Änderung. – jezrael

Verwandte Themen