noob
noob

Reputation: 3811

If else not working with datetime in python Pandas

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

Answers (1)

jezrael
jezrael

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

Related Questions