如何确定日期列表中的天数差异?
Posted
技术标签:
【中文标题】如何确定日期列表中的天数差异?【英文标题】: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
【问题讨论】:
【参考方案1】:我们可以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
【讨论】:
@user,查看我添加的答案。【参考方案2】:有很多方法
选项 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))
【讨论】:
以上是关于如何确定日期列表中的天数差异?的主要内容,如果未能解决你的问题,请参考以下文章