2017-08-09 2 views
4

Ich habe einen rohen Datenmenge, die wie folgt aussieht:Resampling und das Ausfüllen Pandas fehlenden Daten

df = pd.DataFrame({'speed': [66.8,67,67.1,70,69], 
        'time': ['2017-08-09T05:41:30.168Z', '2017-08-09T05:41:31.136Z', '2017-08-09T05:41:31.386Z', '2017-08-09T05:41:31.103Z','2017-08-09T05:41:35.563Z' ]}) 

ich es einige Verarbeitung tun könnte, um es dann aus (entfernt Mikrosekunden) aussehen:

df['time']= pd.to_datetime(df.time) 
df['time'] = df['time'].apply(lambda x: x.replace(microsecond=0)) 

>>> df 
    speed    time 
0 66.8 2017-08-09 05:41:30 
1 67.0 2017-08-09 05:41:31 
2 67.1 2017-08-09 05:41:31 
3 70.0 2017-08-09 05:41:31 
4 69.0 2017-08-09 05:41:35 

Ich muss jetzt die Daten neu berechnen, so dass alle Einträge, die zum selben Zeitstempel gekommen sind, zusammen gemittelt werden, und für die Zeitstempel, die keine Daten erhalten haben, verwende den letzten verfügbaren Wert. Like:

speed    time 
0 66.80 2017-08-09 05:41:30 
1 68.03 2017-08-09 05:41:31 
2 70.00 2017-08-09 05:41:32 
3 70.00 2017-08-09 05:41:33 
4 70.00 2017-08-09 05:41:34 
5 69.00 2017-08-09 05:41:35 

Ich verstehe dies die Verwendung von groupby und resample beinhalten könnte, aber da ein Anfänger ich mich mit diesen zu kämpfen finden. Irgendwelche Ideen zum weiteren Vorgehen?

Ich habe dies versucht, aber ich falschen Ergebnissen bin immer:

df.groupby([df["time"].dt.second]).mean() 
      speed 
time   
30 66.800000 
31 68.033333 
35 69.000000 

Antwort

6
In [279]: df.resample('1S', on='time').mean().ffill() 
Out[279]: 
         speed 
time 
2017-08-09 05:41:30 66.800000 
2017-08-09 05:41:31 68.033333 
2017-08-09 05:41:32 68.033333 
2017-08-09 05:41:33 68.033333 
2017-08-09 05:41:34 68.033333 
2017-08-09 05:41:35 69.000000 
+0

ich 3 Stunden kämpfen mit diesem verbrachte. Ich kann nicht glauben, dass es so einfach ist. Vielen Dank! –

+0

@AlP, froh, ich könnte helfen :) – MaxU