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

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.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:走很长的路

    爆炸

    强制日期到日期时间

    使用 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))
    

【讨论】:

以上是关于如何确定日期列表中的天数差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgresql 视图中获取两个日期时间字段的天数和小时数差异?

如何找到两个日期之间的天数差异[重复]

如何使用javascript查找两个日期之间的天数差异

如何在mongoDB中获取日期差异?日期应该是天数的差异?

通过计算每组条目的天数差异来汇总系统状态中的天数

如何获取 MySQL 上两个日期之间的差异天数?