2017-01-12 55 views
1

我有這樣一個數據幀:不同的行爲與熊貓重採樣和asfreq

      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 

,我想,以確保從開始到結束有是沒有缺失倍(即指數進入從12到12小時,沒有更大的跳躍)。如果有丟失的日期,例如,如果有遺漏,例如值在2015年12月12日12:00:00我想補充一排這樣的:

... 
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 

的問題如何做到這一點在@ ted-petrou在這裏解決了Resampling dataframe in pandas as a checking operation。該解決方案是這樣做的:

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

我的問題:我可以與resample而不是asfreq辦呢?做

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

我得到ValueError: cannot set items on DatetimeIndexResampler。我不明白爲什麼。這種特殊情況下的操作resampleasfreq不是相同的嗎?我錯過了什麼?先謝謝你。

回答

1

請記住,DF.resample()是一個基於時間的組,必須在其每個組上遵循縮減方法。

因此,簡單地使用它只會初始化Resampler,就像調用DF.rolling()方法時發生的那樣。這兩種行爲類似於此:

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

你需要與它一起指定聚合功能它有團體的計算的度量。

中序爲您的情況下做到這一點:

1)使用的兩列.resample().ffill()再與第三個加入這些。當然,由於第三次沒有重新採樣,它們將被填充NaNs

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

2)使用.resample().asfreq()aggfunc類似於你做了什麼:

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

注:用人.asfreq()也許更適合頻率轉換比.resample這裏,如果最終目標不是聚合團體。

+1

謝謝!我不知道在resample之後我必須添加'asfreq()'。我認爲resampling足夠了,就像這裏:http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.resample.html?highlight=resample#pandas.DataFrame.resample這在最近的版本中已經改變。我有Wes McKinney的書,他以舊的方式(我認爲這本書的新版本即將推出)。 – David

+1

是的,早些時候(也許是<'v0.18')'.resample'有一個'how' arg,它違反了跨組的意思。但是現在您需要將其單獨指定爲以下鏈式語法。 –