比较两个日期和月份&日期Python

时间:2017-09-08 06:46:57

标签: python pandas loops date

我有两列日期需要比较,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'

我想将此函数应用于有超过5M行的原始df,因此对于循环不是效率,有没有办法实现这个?

数据类型是日期,而不是日期时间

2 个答案:

答案 0 :(得分:2)

我认为您需要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

答案 1 :(得分:0)

使用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),但如果需要,您可以轻松将其转换为&#34; Y&#34; /&#34; N&#34;