【问题标题】:how can i get compare two date columns with the same category in pandas如何在熊猫中比较具有相同类别的两个日期列
【发布时间】:2018-09-26 19:39:36
【问题描述】:

我对 pandas 很陌生,很抱歉没有多大意义。我有一种按类别分组的感觉,但是我不确定如何在 groupby 中运行函数。

我想从 Date1 中的给定行中查找日期,并查看是否有相同 id 的任何日期(在 date2 中)在 7 天内。

我想通过做来拆分 date1 和 date2,但我不确定从那里去哪里。

g1 = df[['Category', 'Date1']]

g2 = df[['Category', 'Date2']]

dif = pd.Timedelta(7, unit='D')
df['isDateWithin7Days'] = np.where((g1['Category'] == g2['Category'])(df['Date1'] > g2['Date2']-dif, True, False))

我收到这个错误

ValueError:操作数无法与形状一起广播 (50537,) (3,)

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/1/2018
  red           12/1/2018
  red                        11/1/2018

预期结果:

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

【问题讨论】:

  • 为什么isDateWithin7Days? for green, 1/3/2018 是假的?你使用的是mm/dd/yyyy 格式吗?
  • 绿色为假,因为 2018 年 1 月 1 日在 2018 年 1 月 3 日之前。是的,它是 mm/dd/yyyy

标签: python pandas group-by


【解决方案1】:

IIUC,您正在尝试在 date2 列中查找在 categorydate1 的唯一组合的 7 天内的日期 - 如果找到任何此类日期,此代码将返回 True,否则返回False:

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)

输出:

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

【讨论】:

  • 如何获得最小日期值而不是 True 或 False?
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多