3

Pandas データフレーム df1 があります。これは、列 AZ を持つ1 年間の5 分間の時系列です。

df1.shape
(105121, 26)
df1.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2002-01-02 00:00:00, ..., 2003-01-02 00:00:00]
Length: 105121, Freq: 5T, Timezone: None

2 番目のデータフレーム df2 があります。これは、一致する列を持つ1 年間の毎日の時系列 (同じ期間) です。この 2 番目のフレームの値はブール値です。

df2.shape
(365, 26)
df2.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2002-01-02 00:00:00, ..., 2003-01-01 00:00:00]
Length: 365, Freq: D, Timezone: None

df2 を df1 のファンシー インデックスとして使用したい、つまり「df1.ix[df2]」などのようにして、各日付の df1 の列のサブセットを取得します。つまり、df2 がその日付で True であると言うもの (すべてのタイムスタンプを含む)。したがって、結果の形状は (105121, width) である必要があります。ここで、幅は、ブール値が意味する個別の列の数です (幅<=26)。

現在、df1.ix[df2] は部分的にしか機能しません。各日の 00:00 値のみが選択されます。これは、df2 の「ポイントのような」時系列に照らして理にかなっています。

次に、df2 インデックスとしてタイム スパンを試しました。

df2.index
PeriodIndex: 365 entries, 2002-01-02 to 2003-01-01

今回は、次のエラーが表示されます。

/home/wchapman/.local/lib/python2.7/site-packages/pandas-0.11.0-py2.7-linux-x86_64.egg/pandas/core/index.pyc in get_indexer(self, target, method, limit)
    844             this = self.astype(object)
    845             target = target.astype(object)
--> 846             return this.get_indexer(target, method=method, limit=limit)
    847 
    848         if not self.is_unique:

AttributeError: 'numpy.ndarray' object has no attribute 'get_indexer'

私の暫定的な解決策は、日付でループすることですが、これは非効率的です。Pandas はこの種の派手なインデックス作成が可能ですか? ドキュメントのどこにも例がありません。

4

1 に答える 1

0

これを行う 1 つの方法を次に示します。

t_index = df1.index
d_index = df2.index
mask = t_index.map(lambda t: t.date() in d_index)
df1[mask]

そして、少し速く(しかし同じ考えで)使用することです:

mask = pd.to_datetime([datetime.date(*t_tuple)
                           for t_tuple in zip(t_index.year,
                                              t_index.month,
                                              t_index.day)]).isin(d_index)
于 2013-05-15T19:56:54.030 に答える