2016-12-08 6 views
2

2年のチャンクに分割する時系列インデックスtidxがあります。これが私のやり方です。どのようにして半年ごとに2年間の期間を取得するのですか

tidxとコンパニオンtdfを定義

tidx = pd.date_range('1996-12-31', periods=8, freq='2Q') 
tdf = pd.DataFrame(tidx.rename('date'), tidx.rename('tidx')) 
tdf 

enter image description here

pidxコンパニオンp_lookup

期間のインデックスを定義

enter image description here

これは私が

これを行うための効率的な/以下、不器用な方法は何
pd.merge_asof(tdf, p_lookup).set_index('date').period 

date 
1996-12-31 1997 
1997-06-30 1997 
1997-12-31 1997 
1998-06-30 1997 
1998-12-31 1999 
1999-06-30 1999 
1999-12-31 1999 
2000-06-30 1999 
Name: period, dtype: object 

後だものですtidx
あたりpd.Periodオブジェクトを取得するために使用pd.merge_asof ?ここで

+0

私は不器用だとは思わないが、実際には、FY終了などの奇妙な期間に対処したいときに柔軟な明示的期間ルックアップテーブルを提供します。 – Boud

+0

多くのステップ。私は時間と期間の関数の過度で、より簡潔な方法が必要であると感じています。 – piRSquared

答えて

2

ロジックはあなたに非常によく似ています。唯一の変更点は、データフレーム上でasfreq関数を使用することで、年間頻度の生成を迅速に行うことができ、それらのインデックスを取得するだけでよいことです。

ルックアップは、これらの日付を1年(遅れ)で相殺し、翌日以降に開始することができます。以前と同様に、merge_asofを実行して、最も近い値の日付と一致させることができます。

from pandas.tseries.offsets import * 

idx = tdf.asfreq('2A-NOV').index 
lk_up = pd.DataFrame({'date': idx-DateOffset(years=1)+Day(1), 'period': idx.year}) 
pd.merge_asof(tdf, lk_up) 

enter image description here

注:た期間がなく、期間オブジェクトのタイプintです。

1

だけtidxを使用しての方法です、まだそれはあなたの出発点から数学の減算を行う意味:比較すること、ルックアップDFを作成する

nb_years = 2 

a = tidx.to_period('1A-NOV').to_series() 

a 
Out[145]: 
1997 1997 
1997 1997 
1998 1998 
1998 1998 
1999 1999 
1999 1999 
2000 2000 
2000 2000 
Freq: A-NOV, dtype: object 

a.mask((a - a[0]).mod(nb_years) !=0, np.nan).ffill() 
Out[146]: 
1997 1997 
1997 1997 
1998 1997 
1998 1997 
1999 1999 
1999 1999 
2000 1999 
2000 1999 
Freq: A-NOV, dtype: object 
関連する問題