2017-09-08 22 views
2

私は2つの日付の列を比較する必要があります.date1は特定の日付のリストで、date2はランダムな日付(dob)です。私はフラッグを作るために何らかの条件で月と日を比較する必要があります。サンプルのように:月と日の2つの日付を比較するPython

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')} 

私はループは効率ではないので、ために、私は500万行以上のものを持っているorginal DFにこの機能を適用したい

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' 

下回る条件に基づいて関数を作成し、そこにありますこれを達成する方法は?

データ型が日付で、私はあなたが|or)で連鎖した条件でnumpy.whereが必要だと思うない日時

+0

https://stackoverflow.com/questions/8142364/how-to-compare-two-dates –

+0

年を考慮しないでください。私は月と日を比較する必要があります – Baiii

答えて

1

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 
+0

ありがとう、私は日付のデータ型を好むこれを達成する方法はありますか? – Baiii

+0

はい、可能です。 pandasのネイティブタイプはdatetimeなので、dateは遅くなり、 'dt。* '関数を使うことはできません。しかし、最後のステップとして必要な日付が 'df_sample ['date1'] = df_sample ['date1'] .dt.date' – jezrael

0

datetimeを使用しては確かに有益である:

df_sample['dob'] = pd.to_datetime(df_sample['dob']) 
df_sample['date1'] = pd.to_datetime(df_sample['date1']) 
あなたの場合は、「Y」/「N」

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)ですが、簡単にそれを変換することができます:あなたはそれを持っていたら

は、あなたの式は、文字通りすべての行に適用することができます欲しいです。

関連する問題