RRule установлен для дней и часов в сутках

Я использую правило Python для определения торговых часов. Это легко в течение нескольких дней, я использую слегка измененный пример, который я нашел на этом самом сайте:

def get_rset(start_date):    
    # Create a rule to recur every weekday starting today
    r = rrule.rrule(rrule.DAILY,
                    byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR],
                    dtstart=start_date)
    # Create a rruleset
    rs = rrule.rruleset()
    # Attach our rrule to it
    rs.rrule(r)
    # Add holidays as exclusion days
    for exdate in holidays:
        rs.exdate(exdate)
    return rs

Проблема в том, что хотя это отлично работает для акций, мне нужно по-другому рассчитать даты форекс. Мне нужно работать на почасовой основе, добавить в праздничные дни и т. д.

Я полагаю, что в UTC рынки открыты с 22:00 воскресенья до 22:00 следующей пятницы.

Чтобы превратить это в правило, мне теперь нужно 6 разных дней, при этом воскресенье и пятница нуждаются в особых часах, а остальные дни недели считаются всеми часами. Я почти уверен, что мне нужно смешивать rrule byday и byhour, но у меня нет хороших примеров для этого.

Любая помощь приветствуется!


person joeButler    schedule 17.03.2013    source источник


Ответы (1)


Я нашел более простой способ, проведя некоторое время наедине с Google, кодом и документацией класса. Он использует небольшой (но подходящий) чит. См. пример решения ниже.

from dateutil import rrule
from datetime import  timedelta , datetime
holidays = [] # This is just a list of dates to exclude

def datetime_in_x_trading_hours(start_dt,future_hours):
    # First we add two hours. This is because its simpler to view the timeset
    # as 24hrs MON - FRI. (This also helps align the dates for the holidays)
    print start_dt
    start_dt += timedelta(hours=2)
    rs = get_fx_rset(start_dt)
    # Now using the set get the desired time and put the the missing hours
    future_time = rs[future_hours]
    future_time -= timedelta(hours=2)
    return future_time

def get_fx_rset(start_date_time):

    # Create a rule to recur every weekday starting today
    r = rrule.rrule(rrule.HOURLY,
                    byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR],
                    byhour=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
                    byminute=[0],
                    bysecond=[0],
                    dtstart=start_date_time)

    # Create a rruleset
    rs = rrule.rruleset()
    # Attach our rrule to it
    rs.rrule(r)
    # Add holidays as exclusion days
    for exdate in holidays:
        rs.exdate(exdate)

    return rs

today = datetime.now() - timedelta(days=2)
print datetime_in_x_trading_hours(today, 7)
person joeButler    schedule 18.03.2013