2017-06-15 7 views
1

Ein Datenframe enthält nur ein paar Zeitstempel pro Tag und ich muss für jedes Datum den neuesten auswählen (nicht die Werte, der Zeitstempel selbst). die df sieht wie folgt aus:Wählen Sie den letzten Zeitstempel für jedes Datum

       A  B  C 
2016-12-05 12:00:00+00:00 126.0 15.0 38.54 
2016-12-05 16:00:00+00:00 131.0 20.0 42.33 
2016-12-14 05:00:00+00:00 129.0 18.0 43.24 
2016-12-15 03:00:00+00:00 117.0 22.0 33.70 
2016-12-15 04:00:00+00:00 140.0 23.0 34.81 
2016-12-16 03:00:00+00:00 120.0 21.0 32.24 
2016-12-16 04:00:00+00:00 142.0 22.0 35.20 

ich es geschafft, zu erreichen, was ich durch die Definition der folgenden Funktion benötigt:

def find_last_h(df,column): 
    newindex = [] 
    df2 = df.resample('d').last().dropna() 
    for x in df2[column].values: 
     newindex.append(df[df[column]==x].index.values[0]) 
    return pd.DatetimeIndex(newindex) 

, mit dem ich die Spalte Werte zu verwenden, als Filter angeben, um die gewünschten Zeitstempel zu erhalten . Das Problem hier ist im Fall von nicht eindeutigen Werten, die möglicherweise nicht wie gewünscht funktionieren.

Ein anderer Weg, die verwendet wird, ist:

grouped = df.groupby([df.index.day,df.index.hour]) 
    grouped.groupby(level=0).last() 

und dann die Zeitstempel rekonstruieren, aber es ist noch ausführlicher. Was ist der schlaue Weg?

Antwort

3

Verwenden boolean indexing mit Maske erstellt von duplicated und floor für truncate times:

idx = df.index.floor('D') 
df = df[~idx.duplicated(keep='last') | ~idx.duplicated(keep=False)] 
print (df) 
         A  B  C 
2016-12-05 16:00:00 131.0 20.0 42.33 
2016-12-14 05:00:00 129.0 18.0 43.24 
2016-12-15 04:00:00 140.0 23.0 34.81 
2016-12-16 04:00:00 142.0 22.0 35.20 

Eine andere Lösung mit reset_index + set_index:

df = df.reset_index().groupby([df.index.date]).last().set_index('index') 
print (df) 
         A  B  C 
index         
2016-12-05 16:00:00 131.0 20.0 42.33 
2016-12-14 05:00:00 129.0 18.0 43.24 
2016-12-15 04:00:00 140.0 23.0 34.81 
2016-12-16 04:00:00 142.0 22.0 35.20 

resample und groupbydates nur verloren Zeiten:

print (df.resample('1D').last().dropna()) 
       A  B  C 
2016-12-05 131.0 20.0 42.33 
2016-12-14 129.0 18.0 43.24 
2016-12-15 140.0 23.0 34.81 
2016-12-16 142.0 22.0 35.20 

print (df.groupby([df.index.date]).last()) 
       A  B  C 
2016-12-05 131.0 20.0 42.33 
2016-12-14 129.0 18.0 43.24 
2016-12-15 140.0 23.0 34.81 
2016-12-16 142.0 22.0 35.20 
+0

Funktioniert gut, danke! eine Frage, ist das | ~ idx.duplicated (keep = False) wirklich benötigt? Ich bekomme das richtige boolean Array schon ohne es! – marpis

+1

Dieser Code erhält alle eindeutigen Zeilen. Vielleicht in Ihren realen Daten nicht, aber wenn Sie Ihre Probe verwenden, 3. Zeile ohne es wird entfernt. – jezrael

0

wie etwa df.resample('24H',kind='period').last().dropna()?

+0

nicht, weil verlorene Zeiten. – jezrael

+0

was meinst du mit verlorenen Zeiten? – suvy

+0

Ausgabe sind nur Daten ohne Zeiten. – jezrael

Verwandte Themen