2017-11-09 7 views
1

Ich möchte ein Datenframe zurückgeben, das nur die Datensätze eines bestimmten Tages mit einem Datetime-Wert enthält.Slice Pandas DataFrame, um alle Datensätze eines bestimmten Tages anzuzeigen

-Code unten arbeitet:

def dataframeByDay(datetimeValue): 
    cYear = datetimeValue.year 
    cMonth = datetimeValue.month 
    cDay = datetimeValue.day 
    crit = (df.index.year == cYear) & (df.index.month == cMonth) & (df.index.day == cDay) 
    return df.loc[crit] 

Gibt es einen besseren (schnelleren) Weg, dies zu erreichen?

Antwort

1

Da der Index ein DatetimeIndex ist, können Sie Strings verwenden, um es zu trennen.

Betrachten Sie die Datenrahmen df

np.random.seed([3,1415]) 
df = pd.DataFrame(np.random.randint(10, size=(10, 3)), 
        pd.date_range('2016-03-31', periods=10, freq='12H'), 
        list('ABC')) 

df 

        A B C 
2016-03-31 00:00:00 0 2 7 
2016-03-31 12:00:00 3 8 7 
2016-04-01 00:00:00 0 6 8 
2016-04-01 12:00:00 6 0 2 
2016-04-02 00:00:00 0 4 9 
2016-04-02 12:00:00 7 3 2 
2016-04-03 00:00:00 4 3 3 
2016-04-03 12:00:00 6 7 7 
2016-04-04 00:00:00 4 5 3 
2016-04-04 12:00:00 7 5 9 

Not What You Want
Sie wollen nicht die Timestamp

df.loc[pd.to_datetime('2016-04-01')] 

A 0 
B 6 
C 8 
Name: 2016-04-01 00:00:00, dtype: int64 

Statt
Sie diese Technik verwenden können, verwenden:

df.loc['{:%Y-%m-%d}'.format(pd.to_datetime('2016-04-01'))] 

        A B C 
2016-04-01 00:00:00 7 3 1 
2016-04-01 12:00:00 0 6 6 

Ihre Funktion

def dataframeByDay(datetimeValue): 
    return df.loc['{:%Y-%m-%d}'.format(datetimeValue)] 

dataframeByDay(pd.to_datetime('2016-04-01')) 

        A B C 
2016-04-01 00:00:00 7 3 1 
2016-04-01 12:00:00 0 6 6 

Hier sind einige alternative

def dataframeByDay2(datetimeValue): 
    dtype = 'datetime64[D]' 
    d = np.array('{:%Y-%m-%d}'.format(datetimeValue), dtype) 
    return df[df.index.values.astype(dtype) == d] 

def dataframeByDay3(datetimeValue): 
    return df[df.index.floor('D') == datetimeValue.floor('D')] 
+0

allererst nähert, vielen Dank für die Antwort. Ich bin von all der Unterstützung, die ich hier im Internet bekomme, sehr angetan. Ich wollte Sie nur aktualisieren, dass mein Code viel schneller lief (~ 2 Sekunden) als der Code, den Sie hier aktualisiert haben (~ 8 Sekunden) und um zu überprüfen, ob Sie einen weiteren Vorschlag zur Implementierung haben. – joaoavf

+1

Ich habe meinen Beitrag mit einigen alternativen Ansätzen aktualisiert. Ich testete den Code jedoch mit einem 10.000 Zeilen langen Datenrahmen und mein Ansatz war eine Größenordnung schneller. Wenn Sie die Ergebnisse sehen, die Sie beanspruchen, muss es etwas Besonderes geben, was Sie so machen. – piRSquared

Verwandte Themen