2016-07-25 13 views
1

私はdatetimeインデックスを持つ 'score'というシリーズを持っています。四半期と一年のdatetimeインデックスを持つパンダシリーズをフィルタリングする方法

私はquarteryear
擬似コードでそれをサブセットしたい:これまで​​

試み:
s.dt.quarter

AttributeError: Can only use .dt accessor with datetimelike values

s.index.dt.quarter

AttributeError: 'DatetimeIndex' object has no attribute 'dt'

これは、(this answerに触発)動作しますが、私はそれがパンダでこれを行うための正しい方法であると信じてすることはできません。インデックスを強制的にデータセットに変換せずにこれを行う方法がある私は期待し

d = pd.DataFrame(s)
d['date'] = pd.to_datetime(d.index)
d.loc[(d['date'].dt.quarter == 2) & (d['date'].dt.year == 2013)]['scores']

日時に変換し、それからSeriesを取得します。

私は何が欠けていますか、これをPandasシリーズで行うためのエレガントな方法は何ですか?

+1

指数は日時 's.index.quarter'であれば、これは動作します。 – shivsn

+0

特定の年と四半期に取得できる機能はありますか? – piRSquared

+0

IIUCあなたは 'scores.ix [scores.index.quarter == 2]'が必要です。 – shivsn

答えて

1
import numpy as np 
import pandas as pd 

index = pd.date_range('2013-01-01', freq='M', periods=12) 
s = pd.Series(np.random.rand(12), index=index) 
print(s) 

# 2013-01-31 0.820672 
# 2013-02-28 0.994890 
# 2013-03-31 0.928376 
# 2013-04-30 0.848532 
# 2013-05-31 0.122263 
# 2013-06-30 0.305741 
# 2013-07-31 0.088432 
# 2013-08-31 0.647288 
# 2013-09-30 0.640308 
# 2013-10-31 0.737139 
# 2013-11-30 0.233656 
# 2013-12-31 0.245214 
# Freq: M, dtype: float64 

d = pd.Series(s.index, index=s.index) 
quarter = d.dt.quarter.astype(str) + 'Q' + d.dt.year.astype(str) 
print(quarter) 

# 2013-01-31 1Q2013 
# 2013-02-28 1Q2013 
# 2013-03-31 1Q2013 
# 2013-04-30 2Q2013 
# 2013-05-31 2Q2013 
# 2013-06-30 2Q2013 
# 2013-07-31 3Q2013 
# 2013-08-31 3Q2013 
# 2013-09-30 3Q2013 
# 2013-10-31 4Q2013 
# 2013-11-30 4Q2013 
# 2013-12-31 4Q2013 
# Freq: M, dtype: object 

print(s[quarter == '1Q2013']) 

# 2013-01-31 0.124398 
# 2013-02-28 0.052828 
# 2013-03-31 0.126374 
# Freq: M, dtype: float64 

(あなたは一度だけサブセット化されている場合、例えば)あなたは、各四半期のラベルを保持している新しいシリーズを作成したくない場合は、可能性がありでも

print(s[(s.index.quarter == 1) & (s.index.year == 2013)]) 

# 2013-01-31 0.124398 
# 2013-02-28 0.052828 
# 2013-03-31 0.126374 
# Freq: M, dtype: float64 
0

あなたは年と四半期知っている場合は、2013年第2四半期には、あなたがこれを行うことができると言う。

s['2013-04':'2013-06'] 

は機能にそれをラップ:

qmap = pd.DataFrame([ 
     ('01', '03'), ('04', '06'), ('07', '09'), ('10', '12') 
    ], list('1234'), list('se')).T 

def get_quarter(df, year, quarter): 
    s, e = qmap[str(quarter)] 
    y = str(year) 
    s = y + '-' + s 
    e = y + '-' + e 
    return df[s:e] 

とそれを呼び出す:

get_quarter(s, 2013, 2) 

とすると、sは、

s = pd.Series(range(32), pd.date_range('2011-01-01', periods=32, freq='Q')) 

それから私は得る:

2013-03-31 8 
Freq: Q-DEC, dtype: int64 
1

は、あなたがこのようなデータフレームを持っていると仮定します:

sa 
Out[28]: 
      0 
1970-01-31 1 
1970-02-28 2 
1970-03-31 3 
1970-04-30 4 
1970-05-31 5 
1970-06-30 6 
1970-07-31 7 
1970-08-31 8 
1970-09-30 9 
1970-10-31 10 
1970-11-30 11 
1970-12-31 12 

インデックスは、あなたがsa.index.quarterとして四半期を得ることができる日時の場合:

sa.index.quarter 
Out[30]: array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) 
関連する問題