2016-09-20 4 views
3

Ich habe eine CSV-Datei ähnlich wie diesePandas täglich durchschnittlich pandas.resample

Date,Temp1,Temp2 

23-Oct-09 01:00:00,21.1,22.3 

23-Oct-09 04:00:00,22.3,23.8 

23-Oct-09 07:00:00,21.4,21.3 

23-Oct-09 10:00:00,21.5,21.6 

23-Oct-09 13:00:00,22.3,23.8 

23-Oct-09 16:00:00,21.4,21.3 

23-Oct-09 19:00:00,21.1,22.3 

23-Oct-09 22:00:00,21.4,21.3 

24-Oct-09 01:00:00,22.3,23.8 

24-Oct-09 04:00:00,22.3,23.8 

24-Oct-09 07:00:00,21.1,22.3 

24-Oct-09 10:00:00,22.3,23.8 

24-Oct-09 13:00:00,21.1,22.3 

24-Oct-09 16:00:00,22.3,23.8 

24-Oct-09 19:00:00,21.1,22.3 

24-Oct-09 22:00:00,22.3,23.8 

ich die Daten mit gelesen haben:

df=pd.read_csv('data.csv', index_col=0) 

und konvertiert den Index Datum Zeit

df.index=pd.to_datetime(df.index) 

Nun möchte ich den Mittelwert jeder Tagestemperatur nehmen, ich habe versucht, pd.resample wie unten zu verwenden, aber habe Fehler erhalten. Ich habe hier die pandas.resample docs und zahlreiche Beispiele gelesen und bin immer noch mit einem Verlust ...

df_avg = df.resample('D', how = 'mean') 

DataError: No numeric types to aggregate

ich df_avg möchte ein Datenrahmen mit einem Datetime-Index und den beiden 2 Spalten sein . Ich benutze Pandas 0.17.1 und Python 3.5.2, jede Hilfe sehr geschätzt!

Antwort

2

Sie konvertieren müssen string Spalten float zuerst:

#add parameter parse_dates for convert to datetime first column 
df=pd.read_csv('data.csv', index_col=0, parse_dates=[0]) 

df['Temp1'] = df.Temp1.astype(float) 
df['Temp2'] = df.Temp2.astype(float) 

df_avg = df.resample('D', how = 'mean') 

Wenn astype Rückkehr error, Problem ist, gibt es einige nicht numerische Werte. Sie müssen also to_numeric mit errors='coerce' verwenden - dann alle ‚problematisch‘ Werte umgewandelt werden NaN:

df['Temp1'] = pd.to_numeric(df.Temp1, errors='coerce') 
df['Temp2'] = pd.to_numeric(df.Temp2, errors='coerce') 

Sie können auch alle Zeilen mit problematischen Werte überprüfen mit boolean indexing:

print df[pd.to_numeric(df.Temp1, errors='coerce').isnull()] 
print df[pd.to_numeric(df.Temp2, errors='coerce').isnull()] 
+0

Wenn meine Antwort hilfreich war, nicht vergessen [akzeptieren] (http://meta.stackexchange.com/a/5235/295067) es. Vielen Dank. – jezrael

+0

Beachten Sie, dass diese Methode veraltet ist und der Resample-Code jetzt df.resample ('D') sein soll. – PJW

Verwandte Themen