【问题标题】:How to calculate rolling window periods for dates in python?如何计算python中日期的滚动窗口期?
【发布时间】:2020-10-21 15:32:01
【问题描述】:

我是 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 的次数。

请帮忙!!

【问题讨论】:

    标签: python date datetime rolling-computation


    【解决方案1】:

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

    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 天的每个完整周期的 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
    

    【讨论】:

    • 您好,感谢您的回答。但是我不明白RF1和RF2中的列中的数值。我真正想要的是找出“时期”,然后找出每个时期的每一列中出现 False 的次数。我似乎不明白这段代码的输出
    • @PSharma:我的代码统计了每个时期True的数量。
    • 嘿,谢谢,但我在哪里可以看到“句号”?我的意思是我现在看到有 2 列日期。我想查看每个时期的开始和结束日期以及 True 计数。有没有办法做到这一点?
    • 嗨,再次感谢您!我还有一个疑问。请原谅我,因为我有点困惑并且对 Python 很陌生。为什么上述输出中的开始日期和结束日期相同?我的意思是结束日期应该比开始日期多 250 天,对吧?我还需要 True 在那个特定时期出现的次数。我尝试用我的数据运行这段代码,但它没有给我正确的答案!
    • @PSharma 我认为你只想要完整的时期,而我计算的是部分时期。查看我的最后一次编辑。
    【解决方案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 )
    

    【讨论】:

    • 您好,非常感谢您的帮助。虽然代码给了我一个错误。类型错误:+ 不支持的操作数类型:“int”和“str”。我不知道为什么会这样
    • 嗨,谢谢你的代码,代码仍然给我一个错误。在“rf1_true_count = sum(v['RF1'] for v in each_list)”行中。我尝试打印 apply_data,但它似乎是一个空列表
    • 我认为 'RF1' 和 'RF2' 具有布尔值。
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2021-08-13
    • 2018-08-08
    • 1970-01-01
    • 2021-11-16
    • 2022-01-20
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多