5

日時インデックスを持つ「スコア」と呼ばれるシリーズがあります。

私はそれquarteryear
擬似コードでサブセット化したいと思います:series.loc['q2 of 2013']

これまでの試み:
s.dt.quarter

AttributeError: datetimelike 値を持つ .dt アクセサーのみを使用できます

s.index.dt.quarter

AttributeError: 'DatetimeIndex' オブジェクトに属性 'dt' がありません

これは機能します(この回答に触発されました)が、パンダでこれを行う正しい方法だとは信じられません:

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

データセットに変換せずにこれを行う方法があり、インデックスを日時に強制し、そこからシリーズを取得する方法があると思います。

Pandas シリーズでこれを行うエレガントな方法は何ですか?

4

3 に答える 3

3

次のようなデータフレームがあるとします。

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])
于 2016-07-25T18:34:40.337 に答える
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
于 2016-07-25T18:17:12.823 に答える