2016-10-19 3 views
1

У меня есть dataframe, который выглядит следующим образом:создание панды мультииндексных на основе CustomBusinessHour начать

   datetime price tickvol  bid  ask 
0 2016-10-11 12:24:03 2130.25  1 2130.00 2130.25 
1 2016-10-11 13:31:03 2130.25  1 2130.00 2130.25 
... 

У меня есть CustomBusinessHour, который выглядит следующим образом:

cbh = CustomBusinessHour(start='13:30', end='13:15', weekmask='Sun Mon Tue Wed Thu') 

Я надеялся, что я мог бы создать новый уровень индекса, используя начальную временную метку пользовательского рабочего часа, но у меня проблемы с работой.

Что я в надежде попасть что-то вроде:

   cbh   datetime price tickvol  bid  ask 
2016-10-10 13:30:00 2016-10-11 12:24:03 2130.25  1 2130.00 2130.25 
2016-10-11 13:30:00 2016-10-11 13:31:03 2130.25  1 2130.00 2130.25 
+0

Можете ли вы показать пример, когда желаемый результат является результатом ввода? – IanS

+0

Не уверен, что я понимаю. Разве это не ответ на мой вопрос? – jxstanford

+0

То, что я говорю, это то, что ваш вывод не поступал из вашего ввода, потому что даты не совпадают. – IanS

ответ

0

Это то, что я в конечном итоге делает. Он работает, но, вероятно, может быть улучшен. Похоже, что CustomBusinessHour напрямую не раскрывает способ определения времени или отсутствия времени.

def session_start(ts, cbh): 
    """Given a timestamp and a CustomBusinessHour, return the session start 
    timestamp""" 
    assert type(ts) == pd.Timestamp 
    spans = spans_midnight(cbh) 
    t = ts.time() 
    if spans: 
     if cbh.end <= t < cbh.start: 
      return pd.NaT 
     elif t < cbh.start: 
      # this timestamp is part of the previous calendar day session 
      ts = ts.replace(day=ts.day - 1) 
    else: 
     if cbh.end <= t or t < cbh.start: 
      return pd.NaT 

    return ts.replace(hour=cbh.start.hour, minute=cbh.start.minute, 
         second=cbh.start.second, 
         microsecond=cbh.start.microsecond) 


# assuming df looks similar to the one in the problem statement... 
cbh = CustomBusinessHour(start='06:30', end='13:15', 
         weekmask='Mon Tue Wed Thu Fri') 
df['session_start'] = df.index.map(lambda x: session_start(x, cbh)) 
df.dropna(how='all', subset=['session_start'], inplace=True) 
df.set_index(['session_start', df.index], drop=True, inplace=True) 
Смежные вопросы