2017-01-12 6 views
1

Ich habe einen Datenrahmen wie folgt aus:Unterschiedliches Verhalten mit Resampling und asfreq in Pandas

      A  B value 
2014-11-14 12:00:00  30.5 356.3  344 
2014-11-15 00:00:00  30.5 356.3  347 
2014-11-15 12:00:00  30.5 356.3  356 
2014-11-16 00:00:00  30.5 356.3  349 
... 
2017-01-06 00:00:00  30.5 356.3  347 

und ich möchte sicher sein, dass von Anfang an bis zum Ende es keine fehlenden Zeiten sind (dh der Index geht von 12 bis 12 Stunden ohne größere Sprünge). Wenn es ein fehlendes Datum, zum Beispiel ist, wenn ein Wert fehlt, zum Beispiel in 2015.12.12 00.00.00 Ich möchte eine Reihe wie folgt hinzuzufügen:

... 
2015-12-12 00:00:00  30.5 356.3 323 
2015-12-12 12:00:00  30.5 356.3 NaN *<- add this* 
2015-12-13 00:00:00  30.5 356.3 347 

Die Frage, wie es zu tun ist, wurde hier by @ ted-petrou gelöst. Die Lösung wurde dabei:

df1= df.asfreq('12H') 
df1[['A','B']] = df1[['A','B']].fillna(method='ffill') 

Meine Frage: Kann ich es mit resample statt asfreq? Doing

df1= df.resample('12H') 
df1[['A','B']] = df1[['A','B']].fillna(method='ffill') 

ich ValueError: cannot set items on DatetimeIndexResampler. Ich verstehe nicht warum. Sind nicht die gleichen Operationen resample und asfreq für diesen speziellen Fall? Was vermisse ich? Vielen Dank im Voraus.

Antwort

1

Beachten Sie, dass DF.resample() eine zeitbasierte Gruppe ist, auf die eine Reduzierungsmethode für jede ihrer Gruppen folgen muss.

So einfach zu verwenden würde nur die Resampler initialisieren, so wie es passiert, wenn Sie DF.rolling() Methode aufrufen. Beide verhalten sich ähnlich hier:

df[['A', 'B']].resample('12H') 
DatetimeIndexResampler [freq=<12 * Hours>, axis=0, closed=left, label=left, convention=start, base=0] 

Sie benötigen eine Aggregationsfunktion zusammen mit ihm angeben, für sie eine Metrik zur Berechnung von Gruppen zu haben.

Inorder dies für Ihren Fall zu tun:

1) Verwenden Sie .resample().ffill() auf den beiden Säulen und verbinden diese dann mit dem dritten. Natürlich, da das 3. nicht neu abgetastet wurde, würden sie durch NaNs gefüllt werden.

df[['A', 'B']].resample('12H').ffill().join(df['value']) 

2) Verwenden Sie .resample() und .asfreq() als aggfunc ähnlich dem, was Sie getan haben:

df1 = df.resample('12H').asfreq() 
df1[['A','B']] = df1[['A','B']].fillna(method='ffill') 

Hinweis: Einsatz .asfreq() vielleicht besser geeignet für die Frequenzumwandlungen als ein .resample hier, wenn Das Endziel besteht nicht darin, Gruppen zu aggregieren.

+1

Danke! Ich wusste nicht, dass ich '' asfreq() 'nach der Resample hinzufügen musste. Ich dachte, dass Resampling genug ist, wie hier: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.resample.html?highlight=resample#pandas.DataFrame.resample This haben sich in den letzten Versionen geändert. Ich habe Wes McKinneys Buch und er macht es auf die alte Weise (ich denke, dass es bald eine neue Version des Buches geben wird). – David

+1

Yeah, früher (vielleicht <'v0.18')' .resample' hatte ein 'how' arg, das standardmäßig den Mittelwert über Gruppen annahm. Aber jetzt müssen Sie dies unabhängig als eine verkettete Syntax angeben. –

Verwandte Themen