如何从 col2 获得在 col1 7 天内具有相同类别的最早日期?

Posted

技术标签:

【中文标题】如何从 col2 获得在 col1 7 天内具有相同类别的最早日期?【英文标题】:how can I get the earliest date from col2 that is within 7 days of col1 with the same category? 【发布时间】:2019-03-05 23:49:07 【问题描述】:

我正在寻找 col2 中的最早日期,即 col1 中日期的 7 天内

df1:

category        date1        date2      
 blue          1/1/2018     
 blue                       1/2/2018
 blue                       1/5/2018
 blue          2/1/2018
 green         1/3/2018     
 green                      1/8/2018
 red           12/1/2018
 red                        11/1/2018
 red                        12/5/2018



Expected results:

category        date1        date2     isDateWithin7Days?      EarliestDate?
 blue          1/1/2018                      True             1/2/2018
 blue          2/1/2018                      False               0
 green         1/3/2018                      False            1/8/2018
 red           12/1/2018                     False            12/5/2018

在很多帮助下,如果有 7 天的日期,我有返回 TRUE 和 FALSE 的代码。据我了解 .between() 方法,它只返回布尔值。

我怎样才能让它也返回一个日期?

df['date1'] = pd.to_datetime(df['date1'], format = '%m-%d-%y')
df['date2'] = pd.to_datetime(df['date2'], format = '%m-%d-%y')

df1 = df.dropna(subset = ['date1']).drop(columns = ['date2'])
df2 = df.dropna(subset = ['date2']).drop(columns = ['date1'])

df3 = df1.merge(df2, on = 'category')
df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))

df3['isDateWithin7Days?'] = df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))
df3 = df3.groupby(['category', 'date1'])['isDateWithin7Days?'].sum().reset_index()
df3['isDateWithin7Days?'] = np.where(df3['isDateWithin7Days?'] > 0, True, False)

【问题讨论】:

那个方法永远不会返回日期,你想得到哪个日期? 我希望 date2 中最早的日期在 date1 中相同类别的日期之后的 7 天内 【参考方案1】:

这应该可行:

## Execute all code before this:
df3['isDateWithin7Days?'] = df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))

df4 = df3.copy()
min_dates = df4[df4['isDateWithin7Days?']].groupby(['category', 'date1'])['date2'].min().reset_index().rename(columns = 'date2': 'min_date')

df3 = df3.groupby(['category', 'date1'])['isDateWithin7Days?'].sum().reset_index()
df3['isDateWithin7Days?'] = np.where(df3['isDateWithin7Days?'] > 0, True, False)
df3.merge(min_dates, how = 'left', on = ['category', 'date1'])

输出:

  category      date1  isDateWithin7Days?     min_date
0     blue 01-01-2018                True   01-02-2018
1     blue 02-01-2018                False         NaT
2    green 01-03-2018                True   01-08-2018
3      red 12-01-2018                True   12-05-2018

【讨论】:

以上是关于如何从 col2 获得在 col1 7 天内具有相同类别的最早日期?的主要内容,如果未能解决你的问题,请参考以下文章

我不知道如何在Laravel中将表连接到另一个表

如何在 Python 中合并多个具有不同表格列的 Excel 工作表?

如何在sql中排除具有某些值的记录

如何对来自 CSV 的唯一 COL2 和 COL3 值的唯一 COL1 值进行分组

pyspark 相当于 pandas groupby('col1').col2.head()

如何在 pl/pgsql 中声明具有特定列名的行文字?