1

I have dataframe which looks like this

    Date        Player          Fee
0   2017-01-08  Steven Berghuis 6500000
1   2017-07-18  Jerry St. Juste 4500000
2   2017-07-18  Ridgeciano Haps 600000
3   2017-01-07  Sofyan Amrabat  400000

I want to change every date value to str if they match the condition

def is_in_range(x):
ses1 = pd.to_datetime('2013-02-01')
ses2 = pd.to_datetime('2014-02-01')
ses3 = pd.to_datetime('2015-02-01')
ses4 = pd.to_datetime('2016-02-01')
ses5 = pd.to_datetime('2017-02-01')
ses6 = pd.to_datetime('2018-02-01')

if x < ses1 :
     x = '2012-13' 
if x > ses2 and x < ses3 :
     x = '2013-14'
if x > ses3 and x < ses4 :
     x = '2014-15'
if x > ses4 and x < ses5 :
     x = '2015-16'
if x > ses5 and x < ses6 :
     x = '2016-17'
return ses6
aj = ajax_t['Date'].apply(is_in_range)
aj

TypeError Traceback (most recent call last) in () 18 x = '2016-17' 19 return ses6 ---> 20 aj = ajax_t['Date'].apply(is_in_range) 21 aj

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 2353
else: 2354 values = self.asobject -> 2355 mapped = lib.map_infer(values, f, convert=convert_dtype) 2356 2357 if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/src/inference.pyx in pandas._libs.lib.map_infer (pandas/_libs/lib.c:66645)()

in is_in_range(x) 15 if x > ses4 and x < ses5 : 16 x = '2015-16' ---> 17 if x > ses5 and x < ses6 : 18 x = '2016-17' 19 return ses6

pandas/_libs/tslib.pyx in pandas._libs.tslib._Timestamp.richcmp (pandas/_libs/tslib.c:20281)()

TypeError: Cannot compare type 'Timestamp' with type 'str'

I get this error any suggestions, Kindly

1
  • I think your date column may not be in datetime format? I don't know, it depends on your dataframe. If so, you will have to convert that x to datetime as well. Commented Sep 26, 2017 at 15:11

4 Answers 4

1

You need convert to column to_datetime if necessary and change variable x to another, like y, because is overwritten in loop.

Also variable y should be returned from function:

ajax_t['Date'] = pd.to_datetime(ajax_t['Date'])

def is_in_range(x):
    print (x)
    ses1 = pd.to_datetime('2013-02-01')
    ses2 = pd.to_datetime('2014-02-01')
    ses3 = pd.to_datetime('2015-02-01')
    ses4 = pd.to_datetime('2016-02-01')
    ses5 = pd.to_datetime('2017-02-01')
    ses6 = pd.to_datetime('2018-02-01')

    if x < ses1 :
         y = '2012-13' 
    if x > ses2 and x < ses3 :
         y = '2013-14'
    if x > ses3 and x < ses4 :
         y = '2014-15'
    if x > ses4 and x < ses5 :
         y = '2015-16'
    if x > ses5 and x < ses6 :
         y = '2016-17'
    return y
aj = ajax_t['Date'].apply(is_in_range)
print (aj)
0    2015-16
1    2016-17
2    2016-17
3    2015-16
Name: Date, dtype: object
Sign up to request clarification or add additional context in comments.

Comments

1

By using pd.cut

ses1 = pd.to_datetime('2013-02-01')
ses2 = pd.to_datetime('2014-02-01')
ses3 = pd.to_datetime('2015-02-01')
ses4 = pd.to_datetime('2016-02-01')
ses5 = pd.to_datetime('2017-02-01')
ses6 = pd.to_datetime('2018-02-01')

pd.cut(df.Date,[ses1,ses2,ses3,ses4,ses5,ses6],labels=['2012-13','2013-14','2014-15','2015-16','2016-17'])


Out[1227]: 
0    2015-16
1    2016-17
2    2016-17
3    2015-16
Name: Date, dtype: category

Or

ses = pd.to_datetime(['2013-02-01','2014-02-01','2015-02-01','2016-02-01','2017-02-01','2018-02-01'])
pd.cut(df.Date,ses,labels=['2012-13','2013-14','2014-15','2015-16','2016-17'])

2 Comments

this is really nice. Got an edit. You can add it in your own words.
@Bharathshetty will keep it ~ :)
0

Apparently, you did not load Date column as DateTime in your DataFrame ajax_t. Try to convert it

ajax_t['Date'] = pd.to_datetime(ajax_t.Date)

Or if you load the DataFrame ajax_t from file, e.g., data.csv file, you may specify parameters to force parse Date column to be DateTime type.

ajax_t = pd.read_csv('data.csv', parse_dates=['Date'])

Hope this would be helpful.

Comments

0

You can try to change the formatting of the date:

ses1 = pd.to_datetime('2017-01-08', format='%Y%b/%d')

1 Comment

Hope this would be helpful.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.