Kaan Bursa
Kaan Bursa

Reputation: 63

Convert Timestamp to str value python pandas dataframe

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

Answers (4)

Gowtham Balusamy
Gowtham Balusamy

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

BENY
BENY

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

jezrael
jezrael

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

rojeeer
rojeeer

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

Related Questions