chidimo
chidimo

Reputation: 2948

How to delete a date from pandas date_range

So I have a pandas date_range like so

dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D')

I want to remove all the extra days resulting from leap years.

I do a for loop

for each in index:
    if each.month==2 and each.day==29:
        print(each) # I actually want to delete this item from dates

But my problem is that I don't know how to delete the item. The regular python list methods and functions doesn't work. I've looked everywhere on SO. I've looked at the documentation for pandas.date_range but found nothing

Any help will be appreciated.

Upvotes: 5

Views: 6815

Answers (3)

Briag
Briag

Reputation: 11

You can try:

dates = dates[~dates['Date'].str.contains('02-29')] 

In place of Date you will have to put the name of the column where the dates are stored.

You don't have to use the for loop so it is faster to run.

Upvotes: 1

Rakesh Adhikesavan
Rakesh Adhikesavan

Reputation: 12826

You could try creating two Series objects to store the months and days separately and use them as masks.

dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D') #All dates between range
days = dates.day #Store all the days
months = dates.month #Store all the months

dates = dates[(days != 29) & (months != 2)] #Filter dates using a mask

Just to check if the approach works, If you change the != condition to ==, we can see the dates you wish to eliminate.

UnwantedDates = dates[(days == 29) & (months == 2)]

Output:

DatetimeIndex(['2008-02-29', '2012-02-29'], dtype='datetime64[ns]', freq=None)

Upvotes: 2

nitin
nitin

Reputation: 7358

You probably want to use drop to remove the rows.

import pandas as pd
dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D')

leap = []
for each in dates:
    if each.month==2 and each.day ==29:
        leap.append(each)

dates = dates.drop(leap)

Upvotes: 7

Related Questions