【问题标题】:Finding dates between two consecutive dates查找两个连续日期之间的日期
【发布时间】:2021-03-26 18:36:43
【问题描述】:

我有这种格式的熊猫数据框:

Dates
11-Feb-18
18-Feb-18
03-Mar-18
25-Mar-18
29-Mar-18
04-Apr-18
08-Apr-18
14-Apr-18
17-Apr-18
30-Apr-18
04-May-18

我想查找两个连续日期之间的日期。在此示例中,我想创建一个新列,其中将包含两个连续日期之间的日期。例如在 18 年 2 月 11 日和 18 年 2 月 18 日之间,我会得到这两个日期之间的所有日期。

我尝试了这段代码,但它给我带来了错误:

pd.DataFrame({'dates':pd.date_range(pd.to_datetime(df_new['Time.[Day]'].loc[i].diff(-1)))})

【问题讨论】:

  • 你能制作一个你想要的输出的模型表吗?我不确定您是否希望“日期”列被所有缺失的日期扩展,或者您是否想要将所有缺失日期作为列表保存的第二列。
  • 无论如何,这个链接可能会有所帮助stackoverflow.com/questions/7274267/… 虽然这是重复的,但在第二个答案中查找列表理解。恕我直言,这是创建日期范围的最优雅方式
  • @Racooner 我想在数据框中创建一个新列,其中包含两个连续日期之间的所有日期
  • Anjali,你试过我的代码了吗?请善待评论什么是错的。它经过测试。结果是一个包含您想要的日期的数据框

标签: python pandas dataframe datetime


【解决方案1】:

如果您想添加一个列,其中包含中间缺失的日期列表,这应该有效。这可能更有效,它必须绕过最后一行中的NaT,并且按预期变得更长一些,但会给你结果。

import pandas as pd
from datetime import timedelta

test_df = pd.DataFrame({
    "Dates" : 
        ["11-Feb-18", "18-Feb-18", "03-Mar-18", "25-Mar-18", "29-Mar-18", "04-Apr-18",
        "08-Apr-18", "14-Apr-18", "17-Apr-18", "30-Apr-18", "04-May-18"]
    })

res = (
    test_df
        .assign(
            # convert to datetime
            Dates = lambda x : pd.to_datetime(x.Dates),
            # get next rows date
            Dates_next = lambda x : x.Dates.shift(-1),
            # create the date range
            Dates_list = lambda x : x.apply(
                lambda x : 
                    pd.date_range(
                        x.Dates + timedelta(days=1), 
                        x.Dates_next - timedelta(days=1),
                        freq="D").date.tolist()
                    if pd.notnull(x.Dates_next)
                    else None
                , axis = 1
            ))
)
print(res)

结果:

        Dates Dates_next                                         Dates_list
0  2018-02-11 2018-02-18  [2018-02-12, 2018-02-13, 2018-02-14, 2018-02-1...
1  2018-02-18 2018-03-03  [2018-02-19, 2018-02-20, 2018-02-21, 2018-02-2...
2  2018-03-03 2018-03-25  [2018-03-04, 2018-03-05, 2018-03-06, 2018-03-0...
3  2018-03-25 2018-03-29               [2018-03-26, 2018-03-27, 2018-03-28]
4  2018-03-29 2018-04-04  [2018-03-30, 2018-03-31, 2018-04-01, 2018-04-0...
5  2018-04-04 2018-04-08               [2018-04-05, 2018-04-06, 2018-04-07]
6  2018-04-08 2018-04-14  [2018-04-09, 2018-04-10, 2018-04-11, 2018-04-1...
7  2018-04-14 2018-04-17                           [2018-04-15, 2018-04-16]
8  2018-04-17 2018-04-30  [2018-04-18, 2018-04-19, 2018-04-20, 2018-04-2...
9  2018-04-30 2018-05-04               [2018-05-01, 2018-05-02, 2018-05-03]
10 2018-05-04        NaT                                               None

作为旁注,如果您不需要分析后的最后一行,您可以在分配下一个日期后过滤掉最后一行并消除if 语句以使其更快。

【讨论】:

    【解决方案2】:

    这适用于数据框,添加一个包含请求列表的新列 它遍历第 1 列,为第 2 列准备一个列表。

    在它创建一个新的数据框列并将准备好的值分配给它。

    import pandas as pd
    from pprint import pp
    from datetime import datetime, timedelta
    
    df = pd.read_csv("test.csv")
    in_betweens = []
    
    for i in range(len(df["dates"])-1):
        d = datetime.strptime(df["dates"][i],"%d-%b-%y")
        d2 = datetime.strptime(df["dates"][i+1],"%d-%b-%y")
            
        d = d + timedelta(days=1)
        in_between = []
        while d < d2:
            in_between.append(d.strftime("%d-%b-%y"))
            d = d + timedelta(days=1)
    
    
        in_betweens.append(in_between)
        
    in_betweens.append([])
    df["in_betwens"] = in_betweens
    
    df.head()
    

    【讨论】:

    • 但是如何为数据框完成呢?因为我正在处理数据框
    • 我添加了一个基于数据框的版本,请参阅更新的答案
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多