有没有优雅的方法来创建不规则的DatetimeIndex?

时间:2018-03-19 12:57:00

标签: pandas python-datetime

假设我有一个交易日期列表:[20180104, 20180105, 20180108, 20180109]。每天有两个交易期:[09:30, 11:30][13:00, 15:00]。我想创建一个pd.DatetimeIndex包括频率30分钟的所有交易区间,并由右边关闭,即结果将是:

DatetimeIndex(['2018-01-04 10:00:00', '2018-01-04 10:30:00',
               '2018-01-04 11:00:00', '2018-01-04 11:30:00',
               '2018-01-04 13:30:00', '2018-01-04 14:00:00',
               '2018-01-04 14:30:00', '2018-01-04 15:00:00',
               '2018-01-05 10:00:00', '2018-01-05 10:30:00',
               '2018-01-05 11:00:00', '2018-01-05 11:30:00',
               '2018-01-05 13:30:00', '2018-01-05 14:00:00',
               '2018-01-05 14:30:00', '2018-01-05 15:00:00',
               '2018-01-08 10:00:00', '2018-01-08 10:30:00',
               '2018-01-08 11:00:00', '2018-01-08 11:30:00',
               '2018-01-08 13:30:00', '2018-01-08 14:00:00',
               '2018-01-08 14:30:00', '2018-01-08 15:00:00',
               '2018-01-09 10:00:00', '2018-01-09 10:30:00',
               '2018-01-09 11:00:00', '2018-01-09 11:30:00',
               '2018-01-09 13:30:00', '2018-01-09 14:00:00',
               '2018-01-09 14:30:00', '2018-01-09 15:00:00'],
              dtype='datetime64[ns]', freq=None)

这是我的解决方案,但我对此并不满意:

In [17]: import pandas as pd
In [18]: dates = pd.to_datetime([20180104, 20180105, 20180108, 20180109], format='%Y%m%d')
In [19]: delta1 = pd.timedelta_range('9H30Min', '11H30Min', freq='30Min', closed='right')
In [20]: delta2 = pd.timedelta_range('13H', '15H', freq='30Min', closed='right')

In [21]: index = None
In [22]: for date in dates:
    ...:     for delta in [delta1, delta2]:
    ...:         if index is None:
    ...:             index = date + delta
    ...:         else:
    ...:             index = index.append(date + delta)
    ...:             

In [23]: index
Out[23]: 
DatetimeIndex(['2018-01-04 10:00:00', '2018-01-04 10:30:00',
               '2018-01-04 11:00:00', '2018-01-04 11:30:00',
               '2018-01-04 13:30:00', '2018-01-04 14:00:00',
...

有没有更优雅的方法来解决这个问题? (理想情况下,没有for循环)

1 个答案:

答案 0 :(得分:1)

你可以做到

idx=pd.MultiIndex.from_product([dates,delta1.append(delta2)])
idx.get_level_values(0)+idx.get_level_values(1)

Out[441]: 
DatetimeIndex(['2018-01-04 10:00:00', '2018-01-04 10:30:00',
               '2018-01-04 11:00:00', '2018-01-04 11:30:00',
               '2018-01-04 13:30:00', '2018-01-04 14:00:00',
               '2018-01-04 14:30:00', '2018-01-04 15:00:00',
               '2018-01-05 10:00:00', '2018-01-05 10:30:00',
               '2018-01-05 11:00:00', '2018-01-05 11:30:00',
               '2018-01-05 13:30:00', '2018-01-05 14:00:00',
               '2018-01-05 14:30:00', '2018-01-05 15:00:00',
               '2018-01-08 10:00:00', '2018-01-08 10:30:00',
               '2018-01-08 11:00:00', '2018-01-08 11:30:00',
               '2018-01-08 13:30:00', '2018-01-08 14:00:00',
               '2018-01-08 14:30:00', '2018-01-08 15:00:00',
               '2018-01-09 10:00:00', '2018-01-09 10:30:00',
               '2018-01-09 11:00:00', '2018-01-09 11:30:00',
               '2018-01-09 13:30:00', '2018-01-09 14:00:00',
               '2018-01-09 14:30:00', '2018-01-09 15:00:00'],
              dtype='datetime64[ns]', freq=None)