编写一个有条件地搜索每周跟踪数据的函数的最佳方法是什么,从特定点开始到今天结束

What's the best way to write a function that conditionally searches for data tracked each week, starting at a specific point and ending at today

假设有一个字符串格式的日期列表和 M/D/Y 格式:

li = ['2021-03-25', '021-03-28', '2021-04-01', '2021-04-03', '2021-04-06', '2021-04-09', '2021-04-14', '2021-04-19']

假设我们想创建一个包含列 ['weekOf'、'count'] 的 DataFrame,用于计算这些日期中有多少属于从输入日期开始的特定周。此外,这是一个函数,因此第一个星期一将作为输入。我知道让第一行看起来像这样:

li1 = []
        li1.append({'weekOf': (datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days=7)).strftime('%Y-%m-%d'),
                                    'count' : len([x for x in li if (datetime.datetime.strptime(since, '%Y-%m-%d') + datetime.timedelta(days=7)) 
                                    > x > datetime.datetime.strptime(input, '%Y-%m-%d')])
                               })

但是如何将其链接起来以使其不断生成新行直到以今天的日期结束?例如:

 li1 = []
 if datetime.datetime.strptime(input, '%Y-%m-%d') < datetime.date.now:
       li1.append({'weekOf': (datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days=7)).strftime('%Y-%m-%d'),
                                    'count' : len([x for x in li if (datetime.datetime.strptime(since, '%Y-%m-%d') + datetime.timedelta(days=7)) 
                                    > x > datetime.datetime.strptime(input, '%Y-%m-%d')])
                               })
       if (datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days = 7) < datetime.date.now:
               li1.append({'weekOf': (datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days=7)).strftime('%Y-%m-%d'),
                                    'count' : len([x for x in li if (datetime.datetime.strptime(since, '%Y-%m-%d') + datetime.timedelta(days=7)) 
                                    > x > datetime.datetime.strptime(input, '%Y-%m-%d')])
                               })
               if (datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days = 14) < datetime.date.now:
                      li1.append({'weekOf': (datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days=7)).strftime('%Y-%m-%d'),
                                    'count' : len([x for x in li if (datetime.datetime.strptime(since, '%Y-%m-%d') + datetime.timedelta(days=7)) 
                                    > x > datetime.datetime.strptime(input, '%Y-%m-%d')])
                               })


  

...等等

我想出了一个方法来完成这件事。

li1 = []
    #calculates how many weeks the for loop should run based on how many weeks there are from the start date
    end = math.floor((datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time()) - 
                     (datetime.datetime.strptime(input, '%Y-%m-%d'))).days/7)
    counter = 0
    while counter <= end:
        start = datetime.datetime.strptime(input, '%Y-%m-%d') + datetime.timedelta(days = 7 * counter)
        li1.append({'weekOf': (start.strftime('%Y-%m-%d')),
                                'count' : len([x for x in li if (start + datetime.timedelta(days= 7)) 
                                > x >= (start)])
                           })
        counter += 1

    #Creates dataframe from list of dictionaries
    df1 = pd.DataFrame(li1, columns = ['weekOf', 'count'])
    
    return df1