【问题标题】:How to determine the difference in days in a list of dates?如何确定日期列表中的天数差异?
【发布时间】:2021-11-04 18:20:30
【问题描述】:

我有一个数据框,其中包含一个包含日期列表的列。日期的长度范围可以是(2 个以上的日期)。我希望创建一个新列,其中包含此列表中最小日期和最大日期之间的天数,但不完全确定最好的方法是什么?任何帮助将不胜感激!

data = [
    ["Item_1", ["2020-06-01", "2020-06-02", "2020-07-05"]],
    ["Item_2", ["2018-04-15", "2018-04-22"]],
    ["Item_3", ["2016-02-15", "2016-02-22", "2016-03-05", "2016-04-01"]],
]

df = pd.DataFrame(data, columns=["Item_ID", "Dates"])
df

【问题讨论】:

    标签: python pandas list datetime


    【解决方案1】:

    我们可以Series.explodeDates 列,转换to_datetime,然后groupby agg 以找到每个组的最小和最大日期,获取每个组的diff,并将结果分配回一个新的专栏:

    df['Duration'] = (
        # explode lists into usable Series and convert to Datetime
        pd.to_datetime(df['Dates'].explode())
            .groupby(level=0).agg(['min', 'max'])  # Get min and max per group
            .diff(axis=1)  # Diff across rows
            .iloc[:, -1]  # Get the resulting difference
    )
    

    如果保证列表是有序的,我们可以简单地从第一个值中减去列表中的最后一个值,得到转换后的持续时间to_datetime

    df['Duration'] = (
        # get last value in list and subtract from first value 
        # after converting each to datetime
        pd.to_datetime(df['Dates'].str[-1]) - pd.to_datetime(df['Dates'].str[0])
    )
    

    两个选项都产生df:

      Item_ID                                             Dates Duration
    0  Item_1              [2020-06-01, 2020-06-02, 2020-07-05]  34 days
    1  Item_2                          [2018-04-15, 2018-04-22]   7 days
    2  Item_3  [2016-02-15, 2016-02-22, 2016-03-05, 2016-04-01]  46 days
    

    【讨论】:

    • @user,查看我添加的答案。
    【解决方案2】:

    有很多方法

    选项 1:保持 numpy 和一个衬垫

    df['Lapse'] =df.agg(lambda x: np.ptp(np.array(x['Dates'], dtype='datetime64')), axis=1)
    

    选项 2:走很长的路

    1. 爆炸

    2. 强制日期到日期时间

    3. 使用 np.ptpt 找出极端的差异

      df=df.explode('Dates')
           df['Dates']=pd.to_datetime(df['Dates'], format='%d,%m,%Y')
           df.groupby('Item_ID').agg(lapse= ('Dates', np.ptp), Dates=('Dates', list))
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-23
      • 2013-09-21
      • 2016-08-04
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2012-04-16
      相关资源
      最近更新 更多