假设我有一个交易日期列表:[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循环)
答案 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)