<p>您可以使用<code>rolling</code>和<code>sum</code>,然后<code>resample</code>和<code>first</code>使用矢量化的Pandas方法处理数据帧,前提是<code>Date</code>列包含真正的<code>Timestamp</code>对象。如果包含字符串,则必须首先使用以下命令将其转换为时间戳:</p>
<pre><code>df['Date'] = pd.to_datetime(df['Date'])
</code></pre>
<p>我还将假定<code>RF1</code>和<code>RF2</code>列包含真正的布尔值。在这里,如果它们是字符串,则应首先将它们转换为布尔值:</p>
<pre><code>df['RF1'] = df['RF1'] == 'TRUE' # same for RF2
</code></pre>
<p>我已经用以下方法构建了一个与您的数据框相近的示例:</p>
<pre><code>np.random.seed(0) # make data reproducible
df = pd.DataFrame({
'Date': pd.date_range('2008-01-01', periods=500, freq='D'),
'RF1': np.random.choice([True, False], 500),
'RF2': np.random.choice([True, False], 500)})
</code></pre>
<p>它给出:</p>
<pre><code> Date RF1 RF2
0 2008-01-01 True False
1 2008-01-02 False False
2 2008-01-03 False True
3 2008-01-04 True True
4 2008-01-05 False True
.. ... ... ...
495 2009-05-10 True True
496 2009-05-11 False True
497 2009-05-12 True True
498 2009-05-13 False False
499 2009-05-14 True True
</code></pre>
<p>我会首先计算250天内每个完整周期的真实值滚动总和,然后每20天对结果重新采样:</p>
<pre><code># compute the sum of True values per periods of 250 days with start and end
result = df.rolling(250, on='Date').sum().dropna().rename(
columns={'Date': 'End'}).assign(Start=df['Date'] - pd.Timedelta(249, 'D'))
# reorder columns
result = result.reindex(columns=['Start', 'End', 'RF1', 'RF2'])
# resample on every 20th day
result.resample('20D', on='Start').first().reset_index(drop=True)
</code></pre>
<p>它给出:</p>
<pre><code> Start End RF1 RF2
0 2008-01-01 2008-09-06 126.0 123.0
1 2008-01-21 2008-09-26 124.0 120.0
2 2008-02-10 2008-10-16 126.0 122.0
3 2008-03-01 2008-11-05 127.0 121.0
4 2008-03-21 2008-11-25 121.0 129.0
5 2008-04-10 2008-12-15 122.0 122.0
6 2008-04-30 2009-01-04 120.0 122.0
7 2008-05-20 2009-01-24 120.0 120.0
8 2008-06-09 2009-02-13 119.0 119.0
9 2008-06-29 2009-03-05 118.0 127.0
10 2008-07-19 2009-03-25 112.0 124.0
11 2008-08-08 2009-04-14 114.0 134.0
12 2008-08-28 2009-05-04 113.0 133.0
</code></pre>