mlstudent
mlstudent

Reputation: 948

Pandas dataframe get next (trading) day in dataframe

I have a date given that may or may not be a trading day, and I have a pandas dataframe indexed by trading days that has returns of each trading day.

This is my date

dt_query = datetime.datetime(2006, 12, 31, 16)

And I want to do something like this (returns is a pandas dataframe)

returns.ix[pd.Timestamp(dt_query + datetime.timedelta(days = 1))]

However, that may not work as one day ahead may or may not be a trading day. I could make a try block that loops and tries until we find something, but I'm wondering if there's a more elegant way that just uses pandas.

Upvotes: 2

Views: 2921

Answers (3)

Linda MacPhee-Cobb
Linda MacPhee-Cobb

Reputation: 7856

Thank you! That's been plaguing me for hours.

I altered it a bit:

try:
    date_check = dja[start_day]
except KeyError:                        
    print("Start date not a trading day, fetching next trading day...")
    test = dja.index.searchsorted(start_day)
    next_date = dja.index[(dja.index > start_day)]
    start_date = next_date[0]
print("New date:", start_date)

Upvotes: 0

Yanshuai Cao
Yanshuai Cao

Reputation: 1297

This might not be the most the elegant solution but it works.

Here's the idea: from any date dt_query, within a number of calender days (say 10), there must be trading days, and your next trading day is just the first among them. So you can find all days in returns within dt_query and dt_query + timedelta(days = 10), and then get the first one.

Using your example, it should look like

next_trading_date = returns.index[(returns.index > dt_query) & (returns.index <= dt_query + timedelta(days = 10))][0]

Upvotes: 2

Saullo G. P. Castro
Saullo G. P. Castro

Reputation: 58865

You can check the timedelta of the whole column doing:

delta = returns.column - dt_query

then use np.timedelta64() to define a tolerance used to check which rows you want to select:

tol = np.timedelta64(days=2)

and:

returns[delta < tol]

will return the rows within the desired range...

Upvotes: 0

Related Questions