如果Date 列包含真正的Timestamp 对象,您可以使用rolling 和sum,然后使用resample 和first 来处理带有矢量化Pandas 方法的数据帧。它包含字符串,您必须首先将它们转换为时间戳:
df['Date'] = pd.to_datetime(df['Date'])
我还将假设 RF1 和 RF2 列包含真正的布尔值。同样,如果它们是字符串,则应首先将它们转换为布尔值:
df['RF1'] = df['RF1'] == 'TRUE' # same for RF2
我已经建立了一个与您接近的示例数据框:
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)})
它给出:
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
我将首先计算 250 天的每个完整周期的 True 值的滚动总和,然后每 20 天重新采样一次结果:
# 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)
它给出:
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