2017-01-12 4 views
1

私はこのようなデータフレームがあります。異なる挙動は

      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()は時間ベースのグループで、各グループで縮小方法を従わなければなりません。

これを使用すると、DF.rolling()メソッドを呼び出すと同じようにResamplerが初期化されます。どちらも、同様にここに振る舞う:

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

あなたはそれがグループを計算するためのメトリックを持っているため、それに伴い集計関数を指定する必要があります。

INORDERあなたのケースのためにこれを行うには:

1)を2列に.resample().ffill()を使用して、三番目でこれらに参加します。当然ながら、3番目のサンプルは再サンプリングされなかったので、NaNsで埋められます。あなたがやっていることへのaggfunc似たよう.resample().asfreq()を使用し

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

2):

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

注:があれば、ここで多分.resampleよりも周波数変換のためのより適切な.asfreq()を採用最終目標はグループを集約することではありません。

+1

ありがとうございました!再サンプルの後に 'asfreq()'を追加しなければならないかどうかはわかりませんでした。私はここでのようにリサンプリングが十分であると思った: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'引数がありました。しかし、これを次の連鎖構文として独立して指定する必要があります。 –