to_datetime example date_range convert python pandas calendar

python - example - Crear calendario comercial de vacaciones con pandas



time series dataframe python (3)

Si ayuda, tuve una necesidad similar de intercambiar calendarios comerciales. Había un código excelente enterrado en el proyecto Zipline por Quantopian. Extraje la parte relevante y creé un nuevo proyecto para crear calendarios de intercambio de mercado en pandas. Los enlaces están aquí, con algunas de las funciones que se describen a continuación.

https://github.com/rsheftel/pandas_market_calendars

https://pypi.python.org/pypi/pandas-market-calendars

Esto es lo que puede hacer al crear un índice de fecha y hora de pandas de todas las horas abiertas válidas para el NYSE:

import pandas_market_calendars as mcal nyse = mcal.get_calendar(''NYSE'') early = nyse.schedule(start_date=''2012-07-01'', end_date=''2012-07-10'') early market_open market_close =========== ========================= ========================= 2012-07-02 2012-07-02 13:30:00+00:00 2012-07-02 20:00:00+00:00 2012-07-03 2012-07-03 13:30:00+00:00 2012-07-03 17:00:00+00:00 2012-07-05 2012-07-05 13:30:00+00:00 2012-07-05 20:00:00+00:00 2012-07-06 2012-07-06 13:30:00+00:00 2012-07-06 20:00:00+00:00 2012-07-09 2012-07-09 13:30:00+00:00 2012-07-09 20:00:00+00:00 2012-07-10 2012-07-10 13:30:00+00:00 2012-07-10 20:00:00+00:00 mcal.date_range(early, frequency=''1D'') DatetimeIndex([''2012-07-02 20:00:00+00:00'', ''2012-07-03 17:00:00+00:00'', ''2012-07-05 20:00:00+00:00'', ''2012-07-06 20:00:00+00:00'', ''2012-07-09 20:00:00+00:00'', ''2012-07-10 20:00:00+00:00''], dtype=''datetime64[ns, UTC]'', freq=None) mcal.date_range(early, frequency=''1H'') DatetimeIndex([''2012-07-02 14:30:00+00:00'', ''2012-07-02 15:30:00+00:00'', ''2012-07-02 16:30:00+00:00'', ''2012-07-02 17:30:00+00:00'', ''2012-07-02 18:30:00+00:00'', ''2012-07-02 19:30:00+00:00'', ''2012-07-02 20:00:00+00:00'', ''2012-07-03 14:30:00+00:00'', ''2012-07-03 15:30:00+00:00'', ''2012-07-03 16:30:00+00:00'', ''2012-07-03 17:00:00+00:00'', ''2012-07-05 14:30:00+00:00'', ''2012-07-05 15:30:00+00:00'', ''2012-07-05 16:30:00+00:00'', ''2012-07-05 17:30:00+00:00'', ''2012-07-05 18:30:00+00:00'', ''2012-07-05 19:30:00+00:00'', ''2012-07-05 20:00:00+00:00'', ''2012-07-06 14:30:00+00:00'', ''2012-07-06 15:30:00+00:00'', ''2012-07-06 16:30:00+00:00'', ''2012-07-06 17:30:00+00:00'', ''2012-07-06 18:30:00+00:00'', ''2012-07-06 19:30:00+00:00'', ''2012-07-06 20:00:00+00:00'', ''2012-07-09 14:30:00+00:00'', ''2012-07-09 15:30:00+00:00'', ''2012-07-09 16:30:00+00:00'', ''2012-07-09 17:30:00+00:00'', ''2012-07-09 18:30:00+00:00'', ''2012-07-09 19:30:00+00:00'', ''2012-07-09 20:00:00+00:00'', ''2012-07-10 14:30:00+00:00'', ''2012-07-10 15:30:00+00:00'', ''2012-07-10 16:30:00+00:00'', ''2012-07-10 17:30:00+00:00'', ''2012-07-10 18:30:00+00:00'', ''2012-07-10 19:30:00+00:00'', ''2012-07-10 20:00:00+00:00''], dtype=''datetime64[ns, UTC]'', freq=None)

Si solo desea obtener el calendario de vacaciones de pandas que se puede usar en otras funciones de pandas que lo toman como un argumento:

holidays = nyse.holidays() holidays.holidays[-5:] (numpy.datetime64(''2030-05-27''), numpy.datetime64(''2030-07-04''), numpy.datetime64(''2030-09-02''), numpy.datetime64(''2030-11-28''), numpy.datetime64(''2030-12-25''))

Estoy tratando de crear un calendario comercial usando Pandas. Puedo crear una instancia de cal basada en el USFederalHolidayCalendar. El USFederalHolidayCalendar no es consistente con el calendario de Trading, ya que el calendario de Trading no incluye el Día de Colón y el Día de los Veteranos. Sin embargo, el calendario de operaciones incluye el Viernes Santo (no incluido en el calendario de vacaciones de Estados Unidos). Todo excepto la última línea en el siguiente código funciona:

from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday from datetime import datetime cal = get_calendar(''USFederalHolidayCalendar'') # Create calendar instance cal.rules.pop(7) # Remove Veteran''s Day rule cal.rules.pop(6) # Remove Columbus Day rule tradingCal = HolidayCalendarFactory(''TradingCalendar'', cal, GoodFriday)

La instancia de tradingCal parece funcionar porque puedo ver las reglas de vacaciones.

In[10]: tradingCal.rules Out[10]: [Holiday: Labor Day (month=9, day=1, offset=<DateOffset: kwds={''weekday'': MO(+1)}>), Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: kwds={''weekday'': MO(+3)}>), Holiday: Good Friday (month=1, day=1, offset=[<Easter>, <-2 * Days>]), Holiday: Dr. Martin Luther King Jr. (month=1, day=1, offset=<DateOffset: kwds={''weekday'': MO(+3)}>), Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x000000000A190BA8>), Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: kwds={''weekday'': TH(+4)}>), Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x000000000A190BA8>), Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x000000000A190BA8>), Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: kwds={''weekday'': MO(-1)}>)]

Cuando intento listar los días festivos en un rango de fechas, aparece el siguiente error:

In[11]: tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) Traceback (most recent call last): File "C:/Python27/lib/site-packages/IPython/core/interactiveshell.py", line 3035, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-12-2708cd2db7a0>", line 1, in <module> tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) TypeError: unbound method holidays() must be called with TradingCalendar instance as first argument (got datetime instance instead)

¿Algunas ideas?


Tal vez sea más sencillo crear el calendario comercial desde cero, así:

import datetime as dt from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, / USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, / USLaborDay, USThanksgivingDay class USTradingCalendar(AbstractHolidayCalendar): rules = [ Holiday(''NewYearsDay'', month=1, day=1, observance=nearest_workday), USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, Holiday(''USIndependenceDay'', month=7, day=4, observance=nearest_workday), USLaborDay, USThanksgivingDay, Holiday(''Christmas'', month=12, day=25, observance=nearest_workday) ] def get_trading_close_holidays(year): inst = USTradingCalendar() return inst.holidays(dt.datetime(year-1, 12, 31), dt.datetime(year, 12, 31)) if __name__ == ''__main__'': print(get_trading_close_holidays(2016)) # DatetimeIndex([''2016-01-01'', ''2016-01-18'', ''2016-02-15'', ''2016-03-25'', # ''2016-05-30'', ''2016-07-04'', ''2016-09-05'', ''2016-11-24'', # ''2016-12-26''], # dtype=''datetime64[ns]'', freq=None)


Tienes que crear una nueva instancia de la clase: cal1 = tradingCal() . Esto funciona para mí.

from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday from datetime import datetime cal = get_calendar(''USFederalHolidayCalendar'') # Create calendar instance cal.rules.pop(7) # Remove Veteran''s Day rule cal.rules.pop(6) # Remove Columbus Day rule tradingCal = HolidayCalendarFactory(''TradingCalendar'', cal, GoodFriday) print tradingCal.rules #new instance of class cal1 = tradingCal() print cal1.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) #DatetimeIndex([''2015-01-01'', ''2015-01-19'', ''2015-02-16'', ''2015-04-03'', # ''2015-05-25'', ''2015-07-03'', ''2015-09-07'', ''2015-11-26'', # ''2015-12-25'', ''2016-01-01'', ''2016-01-18'', ''2016-02-15'', # ''2016-03-25'', ''2016-05-30'', ''2016-07-04'', ''2016-09-05'', # ''2016-11-24'', ''2016-12-26''], # dtype=''datetime64[ns]'', freq=None, tz=None)