我有一个数据帧,其中包含一列日期列表。日期的长度范围可以是(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.explode
到Dates
列,转换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:走很长的路
分解
强制日期到日期时间
使用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))