3

大小の2つの非常に長いシリーズがあるとしましょう

index = pd.date_range(start='1952', periods=10**6, freq='s')
big = pd.Series(np.ones(len(index))*97, index)
small = pd.Series(np.ones(len(index))*2, index)

私が達成したいのは、それらの値を交互に組み合わせbigて、他の値に切り替えるタイミングを決定するために使用する新しいシリーズを作成することです(たとえば、5秒ごとに境界線があります)smallborders

borders = pd.date_range(start='1952', periods=len(index)/5.0, freq='5s')

これを達成するために使用できる効率的なマトリックスベースの操作コンボはありますか?ドキュメントでさまざまな結合、マージなどの演算子を調べてみましたが、同様のロジックを提供するものは見つかりませんでした。

len()forループを使用してこれを実現できましたが、 10ˆ5のシリーズでも1分以上続きます

alternating = pd.Series()
for i in range(1, 100, 2):
    b0 = borders[i-1]
    b1 = borders[i]
    b2 = borders[i+1]
    sec = pd.offsets.Second(1)
    alternating = alternating.append(small[b0:b1-sec]).append(big[b1:b2-sec])

のサンプル出力alternating.head(24)

1952-01-16 00:00:00     2
1952-01-16 00:00:01     2
1952-01-16 00:00:02     2
1952-01-16 00:00:03     2
1952-01-16 00:00:04     2
1952-01-16 00:00:05    97
1952-01-16 00:00:06    97
1952-01-16 00:00:07    97
1952-01-16 00:00:08    97
1952-01-16 00:00:09    97
1952-01-16 00:00:10     2
1952-01-16 00:00:11     2
1952-01-16 00:00:12     2
1952-01-16 00:00:13     2
1952-01-16 00:00:14     2
1952-01-16 00:00:15    97
1952-01-16 00:00:16    97
1952-01-16 00:00:17    97
1952-01-16 00:00:18    97
1952-01-16 00:00:19    97
1952-01-16 00:00:20     2
1952-01-16 00:00:21     2
1952-01-16 00:00:22     2
1952-01-16 00:00:23     2
4

1 に答える 1

2

月経が1分未満の場合は、次のように試すことができます。

index = pd.date_range(start='1952', periods=10**6, freq='s')
big = pd.Series(np.ones(len(index))*97, index)
small = pd.Series(np.ones(len(index))*2, index)

alternating = big[big.index.second % 10 >= 5].combine_first(small)

alternating要求どおりに表示され、150ミリ秒以内に計算されます。

于 2013-01-16T14:12:59.823 に答える