Reputation: 3811
Background
I have a dataframe df. It has order_dates for customers(when was transaction done etc. I am trying to create a new column recent which will have 1 if the transaction was recent(within 1 month from today) and 0 if it is not a recent transaction.
e.g.
Current df
order_date
2019-01-01
2019-12-14
2019-10-12
2019-11-22
Output df needed
order_date recent
2019-01-01 0
2019-12-14 1
2019-10-12 0
2019-11-22 0
2019-12-09 1
Code:
import datetime
df['recent'] = 9
df['order_date'] = pd.to_datetime(df['order_date']).dt.date
if ((df['order_date']) >(datetime.date.today() - datetime.timedelta(1*365/12))).any():
df['recent'] == 1
else:
df['recent'] == 0
I wrote default value 9 for recent because if else was not working and now I am getting all 9 values in df['recent']
Some basic background:
[IN]:print(df['order_date'].loc[0])
2019-01-01
[IN]:type(df['order_date'])
pandas.core.series.Series
[IN]:print(datetime.date.today() - datetime.timedelta(1*365/12))
2019-12-01
[IN]:type(datetime.date.today() - datetime.timedelta(1*365/12))
datetime.date
Upvotes: 2
Views: 948
Reputation: 863671
Convert boolean mask to integers by Series.astype
:
df['order_date'] = pd.to_datetime(df['order_date']).dt.date
#solution for oldier pandas versions
#df['order_date'] = pd.to_datetime(df['order_date']).dt.floor('d')
m = (df['order_date']) >(datetime.date.today() - datetime.timedelta(1*365/12))
df['recent'] = m.astype(int)
Or set values by numpy.where
:
df['recent'] = np.where(m, 1, 0)
Upvotes: 2