Reputation: 63
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
Upvotes: 1
Views: 2471
Reputation: 742
You can try to change the formatting of the date:
ses1 = pd.to_datetime('2017-01-08', format='%Y%b/%d')
Upvotes: 0
Reputation: 323226
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'])
Upvotes: 1
Reputation: 862641
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
Upvotes: 1
Reputation: 2011
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.
Upvotes: 0