Ramprasath
Ramprasath

Reputation: 129

Converting to date format in pandas

I have a dataframe that contains a column which holds:

Date:
31062005
072005
12005
2012

I would like to convert these dates to the format:

Date:
31/06/2005
07/2005
01/2005
2012

What is the simplest way to do this? The fields are not in a date format yet, only strings.

Upvotes: 1

Views: 155

Answers (2)

Ami Tavory
Ami Tavory

Reputation: 76297

suppose you write a function

def convert_date(s):
    if len(s) == 4:
        return s
    elif len(s) < 7:
        return s[: -4].zfill(2) + '/' + s[-4: ]
    else:
        return s[: -6].zfill(2) + '/' + s[-6: -4].zfill(2) + '/' + s[-4]

Then if your dates are in df.dates, you can use

>>> df.dates.apply(convert_date)                                   
0    31/06/2
1    07/2005
2    01/2005
3       2012
Name: dates, dtype: object

Note that this converts a string in one form to a string in a different form, meaning you can't really manipulate dates further. If you want to do that, I'd suggest you amend the preceding function to use the appropriate datetime.datetime.strptime for the format matching the length of the string. It could look something like this:

def convert_date(s):
    if len(s) == 4:
        return datetime.datetime.strptime('%Y')
    elif len(s) < 8:
        return datetime.datetime.strptime('%m%Y')
    else:
        return datetime.datetime.strptime('%d%m%Y')

Note that your first date (with the 31 days) seems illegal, though.

Upvotes: 1

Kartik
Kartik

Reputation: 8683

Here:

df = pd.DataFrame(['30/06/2005', '07/2005', '1/2005', '2012'], columns=['Date'])

temp = pd.DataFrame(df['Date'].str.split('/').apply(reversed).tolist())\
    .fillna('01')
df['Date'] = pd.to_datetime(temp[0].str.cat(temp[1].str.zfill(2))\
                            .str.cat(temp[2].str.zfill(2)), format='%Y%m%d')

Upvotes: 2

Related Questions