按月和日期比较两个日期Python

Posted

技术标签:

【中文标题】按月和日期比较两个日期Python【英文标题】:Compare two date by month & date Python 【发布时间】:2018-02-17 00:17:22 【问题描述】:

我有两列日期需要比较,date1 是某些日期的列表,date2 是随机日期(dob)。我需要通过某种条件比较月份和日期来制作标志。样例:

df_sample = DataFrame('date1':('2015-01-15','2015-01-15','2015-03-15','2015-04-15','2015-05-15'),
                       'dob':('1999-01-25','1987-12-12','1965-03-02','2000-08-02','1992-05-15')

我根据以下条件创建一个函数

def eligible(date1,dob):
  if date1.month - dob.month==0 and date1.day <= dob.day:
    return 'Y'
  elif date1.month - dob.month==1 and date1.day > dob.day:
    return 'Y'
  else:
    return 'N'

我想将这个函数应用到原始 df 超过 5M 行,因此 for 循环效率不高,有什么方法可以实现吗?

数据类型是 date,而不是 datetime

【问题讨论】:

***.com/questions/8142364/how-to-compare-two-dates 嘿,我不考虑年份,我只需要比较月份和日期 【参考方案1】:

我认为您需要numpy.where| (or) 链接的条件:

df_sample['date1'] = pd.to_datetime(df_sample['date1'])
df_sample['dob'] = pd.to_datetime(df_sample['dob'])

months_diff = df_sample.date1.dt.month  - df_sample.dob.dt.month
days_date1 = df_sample.date1.dt.day
days_dob = df_sample.dob.dt.day

m1 = (months_diff==0) & (days_date1 <= days_dob)
m2 = (months_diff==1) & (days_date1 > days_dob)

df_sample['out'] = np.where(m1 | m2 ,'Y','N')
print (df_sample)
       date1        dob out
0 2015-01-15 1999-01-25   Y
1 2015-01-15 1987-12-12   N
2 2015-03-15 1965-03-02   N
3 2015-04-15 2000-08-02   N
4 2015-05-15 1992-05-15   Y

【讨论】:

谢谢,如果我更喜欢日期数据类型,有什么方法可以实现吗? 是的,有可能。但是 pandas 的原生类型是 datetime,因此 date 可能会更慢,并且无法使用 dt.* 函数。但如果需要日期作为最后一步,请使用df_sample['date1'] = df_sample['date1'].dt.date【参考方案2】:

使用datetime 肯定是有益的:

df_sample['dob'] = pd.to_datetime(df_sample['dob'])
df_sample['date1'] = pd.to_datetime(df_sample['date1'])

一旦你有了它,你的公式就可以真正应用于所有行:

df_sample['eligible'] = 
              (  (df_sample.date1.dt.month == df_sample.dob.dt.month)\
               & (df_sample.date1.dt.day <= df_sample.dob.dt.day)) |\
              (  (df_sample.date1.dt.month - df_sample.dob.dt.month == 1)\
               & (df_sample.date1.dt.day > df_sample.dob.dt.day))

结果是布尔值 (True/False),但如果需要,您可以轻松地将其转换为“Y”/“N”。

【讨论】:

以上是关于按月和日期比较两个日期Python的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:在日期时间字段中按月和年分组

如何在 Jooq 中按月和年将毫秒翻译成日期和分组?

Drupal 视图 UI,过滤器暴露,集合字段内容中的日期仅按月和年(无天)

如何按月汇总销售额并进行比较

pandas:按月和天匹配数据

python 求日期