Reputation: 7448
I have the a df
,
date1 date2
2019-05-31 2019-06-01
NaT NaN
2018-07-01 2018-08-01
NaT 2019-06-03
2019-01-01 NaN
I want to create a boolean column on_time
based on -3 <= date2 - date1 <= 0
, if any values in date1
or date2
is NaN
or NaT
, make on_time = False
;
a = df['date1'].isna()
b = df['date2'].isna()
df['on_time'] = (a | b)
m = (-3 <= (df.loc[~a&~b, 'date1'] - df.loc[~a&~b, 'date2']).dt.days) & \
((df.loc[~a&~b, 'date1'] - df.loc[~a&~b, 'date2']).dt.days <= 0)
df['on_time'] = m
I am wondering if there is a better way to do it, more concise and efficient way.
Upvotes: 1
Views: 927
Reputation: 75080
IIUC, you can create a helper series with series.dt.days()
and compare using s.ge()
and le
:
s=(df.date2-df.date1).dt.days
df=df.assign(on_time=s.ge(-3)&s.le(0))
date1 date2 on_time
0 2019-05-31 2019-06-01 False
1 NaT NaT False
2 2018-07-01 2018-08-01 False
3 NaT 2019-06-03 False
4 2019-01-01 NaT False
Upvotes: 3
Reputation: 3770
## if the dates are of type str
df['date1'] = pd.to_datetime(df['date1'])
df['date2'] = pd.to_datetime(df['date2'])
(df['date2'] - df['date1']).apply(lambda x: True if -3<= x.days <=0 else False)
Output
date1 date2 on_time
0 2019-05-31 2019-06-01 False
1 NaT NaT False
2 2018-07-01 2018-08-01 False
3 NaT 2019-06-03 False
4 2019-01-01 NaT False
Upvotes: 1