如何计算 python 中日期的滚动 window 周期?

How to calculate rolling window periods for dates in python?

我是 python 的新手,非常感谢您的帮助! 我想滚动计算日期期间。 我有如下输入数据:

Date        RF1     RF2
01-01-2008  TRUE    FALSE   
02-01-2008  TRUE    FALSE   
03-01-2008  FALSE   FALSE   
04-01-2008  FALSE   FALSE   
05-01-2008  FALSE   FALSE   
06-01-2008  FALSE   FALSE   
07-01-2008  FALSE   FALSE   
08-01-2008  FALSE   FALSE   
09-01-2008  FALSE   FALSE   
10-01-2008  FALSE   FALSE   
11-01-2008  FALSE   FALSE   

我想在 20 天的滚动基础上计算 250 天的不同日期期间,然后检查该期间有多少次 False。

例如:我的第一个月经是 2008 年 1 月 1 日+250 天

那么我的第二期应该是从1月21日+250天等等

然后对于每个周期,我需要检查每列出现错误的次数。

请帮忙!!

假设您有如下 data

data = [
    {'Date': '01-01-2008', 'RF1': True, 'RF2': False},
    ...
]

然后可以算出false的个数

from itertools import islice

apply_data = [list(islice(data, n, n+250)) for n in range(0, len(data), 20)]
for each_list in apply_data:
    rf1_true_count = sum(v['RF1'] for v in each_list)
    rf1_false_count = 250 - rf1_true_count 
    print(rf1_false_count )

    rf2_true_count = sum(v['RF2'] for v in each_list)
    rf2_false_count = 250 - rf2_true_count 
    print(rf2_false_count )

您可以使用 rollingsum,然后 resamplefirst 使用矢量化 Pandas 方法处理数据帧,前提是 Date 列包含真正的 Timestamp 个对象。它包含字符串,您必须首先将它们转换为时间戳:

df['Date'] = pd.to_datetime(df['Date'])

我还将假设 RF1RF2 列包含真布尔值。同样,如果它们是字符串,您应该首先将它们转换为布尔值:

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 天完整周期的真实值的滚动总和,然后每 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