Сначала преобразуйте оба столбца в datetime с параметром errors='coerce'
для пропущенных значений, если неправильные даты, такие как строки continuing
, и при необходимости добавьте также параметр dayfirst=True
, затем вычтите значения, получите дни на Series.dt.days
из timedeltas и last, если необходимо, замените значения затуманивания на Series.fillna
:
f9['Join Date'] = pd.to_datetime(f9['Join Date'], errors='coerce', dayfirst=True)
f9['End date'] = pd.to_datetime(f9['End date'], errors='coerce', dayfirst=True)
f9['Num of days'] = (f9['End date'] - f9['Join Date']).dt.days.fillna('continuing')
print (f9)
name country Join Date End date Num of days
0 Wrt IND 2016-02-01 2017-09-08 585
1 Grt China 2015-02-03 2018-06-12 1225
2 frt France 2017-03-08 NaT continuing
3 srt Scottland 2018-04-09 NaT continuing
4 crt china 2016-07-09 2018-08-07 759
Или:
f9['Join Date'] = pd.to_datetime(f9['Join Date'], errors='coerce')
f9['End date'] = pd.to_datetime(f9['End date'], errors='coerce')
f9['Num of days'] = (f9['End date'] - f9['Join Date']).dt.days.fillna('continuing')
print (f9)
name country Join Date End date Num of days
0 Wrt IND 2016-01-02 2017-08-09 585
1 Grt China 2015-03-02 2018-12-06 1375
2 frt France 2017-08-03 NaT continuing
3 srt Scottland 2018-09-04 NaT continuing
4 crt china 2016-09-07 2018-07-08 669
Также последним шагом следует заменить отсутствующие значения,но потерял столбец datetime
s, получайте смешанные строки с datetimes
, поэтому более поздние функции типа datetime не сработали:
f9['End date'] = f9['End date'].fillna('continuing')
print (f9)
name country Join Date End date Num of days
0 Wrt IND 2016-01-02 2017-08-09 00:00:00 585
1 Grt China 2015-03-02 2018-12-06 00:00:00 1375
2 frt France 2017-08-03 continuing continuing
3 srt Scottland 2018-09-04 continuing continuing
4 crt china 2016-09-07 2018-07-08 00:00:00 669
EDIT:
Вы можете добавить несколько условий, сверху или снизучисла, также здесь возможно использование Series.between
функция:
f9['Join Date'] = pd.to_datetime(f9['Join Date'], errors='coerce')
f9['End date'] = pd.to_datetime(f9['End date'], errors='coerce')
f9['Num of days'] = (f9['End date'] - f9['Join Date']).dt.days
m1 = f9['Num of days'] > 730
m2 = f9['Num of days'].between(365, 730)
m3 = f9['Num of days'] < 365
m4 = f9['Num of days'].isna()
f9['Status'] = np.select([m1, m2, m3,m4], ['U','L', 'N','EOL'])
f9[['End date','Num of days']] = f9[['End date','Num of days']].fillna('continuing')
print (f9)
name country Join Date End date Num of days Status
0 Wrt IND 2016-01-02 2017-08-09 00:00:00 585 L
1 Grt China 2015-03-02 2018-12-06 00:00:00 1375 U
2 frt France 2017-08-03 continuing continuing EOL
3 srt Scottland 2018-09-04 continuing continuing EOL
4 crt china 2016-09-07 2018-07-08 00:00:00 669 L
Другая идея заключается в использовании cut
для биннинга:
f9['Join Date'] = pd.to_datetime(f9['Join Date'], errors='coerce')
f9['End date'] = pd.to_datetime(f9['End date'], errors='coerce')
f9['Num of days'] = (f9['End date'] - f9['Join Date']).dt.days
f9['Status']=pd.cut(f9['Num of days'],bins=[-np.inf, 365, 730, np.inf],labels=['U','L', 'N'])
f9['Status'] = f9['Status'].cat.add_categories(['EOL']).fillna('EOL')
f9[['End date','Num of days']] = f9[['End date','Num of days']].fillna('continuing')
print (f9)
name country Join Date End date Num of days Status
0 Wrt IND 2016-01-02 2017-08-09 00:00:00 585 L
1 Grt China 2015-03-02 2018-12-06 00:00:00 1375 N
2 frt France 2017-08-03 continuing continuing EOL
3 srt Scottland 2018-09-04 continuing continuing EOL
4 crt china 2016-09-07 2018-07-08 00:00:00 669 L