如何在python中计算日期的滚动窗口周期?

2024-05-23 16:46:19 发布

您现在位置: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天,以此类推

然后,对于每个时段,我需要检查每列出现False的次数

请帮忙


Tags: 数据falsetruedate次数基础新手时段
2条回答

假设您有data类的以下内容

data = [
    {'Date': '01-01-2008', 'RF1': True, 'RF2': 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

相关问题 更多 >