如何确定日期列表中的天数差异



我有一个数据帧,其中包含一列日期列表。日期的长度范围可以是(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

我们可以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

有很多方法

选项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))
    

最新更新