python - pd.date_range如何排除几个小时

标签 python pandas date-range

大家好,我有一个关于使用 pd.date_range() 的问题。我正在做 ARIMA 模型,一步中我需要预测一些价格值。例如,在 2021-01-04 11:20 的时间。我想用 freq = '5Min' 生成接下来的 4 个日期索引,所以我编写了以下代码

pd.date_range(start = '2021-01-04 11:20', periods = 5, freq = '5Min')

这给出了

['2021-01-04 11:20', '2021-01-04 11:25', '2021-01-04 11:30', '2021-01-04 11:35', '2021-01-04 11:40']

但是市场在下午开市。因此,11:30 之后,市场将在“2021-01-04 15:00”开盘,所以该系列应该是。

['2021-01-04 11:20', '2021-01-04 11:25', '2021-01-04 15:00', '2021-01-04 15:05', '2021-01-04 15:10'].

那么如何自定义频率以便我可以排除一天中的一些“小时范围”?

谢谢!我真的很感激!

最佳答案

使用DatetimeIndex.indexer_between_time寻找位置,然后通过 np.isin 过滤掉这个值在 boolean indexing :

r = pd.date_range(start = '2021-01-04 00:00', periods = 100, freq = '30Min')

ind = (r.indexer_between_time('11:30','13:30').tolist() +
       r.indexer_between_time('15:00','21:00').tolist() +
       r.indexer_between_time('23:00','09:00').tolist())
# print (ind)

out = r[np.isin(np.arange(len(r)), ind, invert=True)]
print (out)
DatetimeIndex(['2021-01-04 09:30:00', '2021-01-04 10:00:00',
               '2021-01-04 10:30:00', '2021-01-04 11:00:00',
               '2021-01-04 14:00:00', '2021-01-04 14:30:00',
               '2021-01-04 21:30:00', '2021-01-04 22:00:00',
               '2021-01-04 22:30:00', '2021-01-05 09:30:00',
               '2021-01-05 10:00:00', '2021-01-05 10:30:00',
               '2021-01-05 11:00:00', '2021-01-05 14:00:00',
               '2021-01-05 14:30:00', '2021-01-05 21:30:00',
               '2021-01-05 22:00:00', '2021-01-05 22:30:00'],
              dtype='datetime64[ns]', freq=None)

另一个想法是使用掩码:

from datetime import time

r = pd.date_range(start = '2021-01-04 00:00', periods = 100, freq = '30Min')

m = ((r.time > time(hour=9, minute=0)) & (r.time < time(hour=11, minute=30)) |
     (r.time > time(hour=13, minute=30)) & (r.time < time(hour=15, minute=0)) |
     (r.time > time(hour=21, minute=0)) & (r.time < time(hour=23, minute=0)))
       
print (m)

out = r[m]
print (out)
DatetimeIndex(['2021-01-04 09:30:00', '2021-01-04 10:00:00',
               '2021-01-04 10:30:00', '2021-01-04 11:00:00',
               '2021-01-04 14:00:00', '2021-01-04 14:30:00',
               '2021-01-04 21:30:00', '2021-01-04 22:00:00',
               '2021-01-04 22:30:00', '2021-01-05 09:30:00',
               '2021-01-05 10:00:00', '2021-01-05 10:30:00',
               '2021-01-05 11:00:00', '2021-01-05 14:00:00',
               '2021-01-05 14:30:00', '2021-01-05 21:30:00',
               '2021-01-05 22:00:00', '2021-01-05 22:30:00'],
              dtype='datetime64[ns]', freq=None)

下一个替代方案为 numpy.r_用于连接索引并按它们过滤:

ind1 = (np.r_[r.indexer_between_time('9:00','11:30', include_start=False, include_end=False),
              r.indexer_between_time('13:30','15:00', include_start=False, include_end=False),
              r.indexer_between_time('21:00','23:00', include_start=False, include_end=False)])

out = r[ind1]
print (out)
DatetimeIndex(['2021-01-04 09:30:00', '2021-01-04 10:00:00',
               '2021-01-04 10:30:00', '2021-01-04 11:00:00',
               '2021-01-05 09:30:00', '2021-01-05 10:00:00',
               '2021-01-05 10:30:00', '2021-01-05 11:00:00',
               '2021-01-04 14:00:00', '2021-01-04 14:30:00',
               '2021-01-05 14:00:00', '2021-01-05 14:30:00',
               '2021-01-04 21:30:00', '2021-01-04 22:00:00',
               '2021-01-04 22:30:00', '2021-01-05 21:30:00',
               '2021-01-05 22:00:00', '2021-01-05 22:30:00'],
              dtype='datetime64[ns]', freq=None)

关于python - pd.date_range如何排除几个小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66130594/

相关文章:

python - 使用 beautiful soup 有条件地获取类内容

python - 字符串与特定变量字符的组合

python - Pandas 数据帧 : groupby then transpose

javascript - JQuery:如何在范围内设置日期选择器的开始日期

python - 按一列或另一列对 pandas 数据框进行分组

python - 从表创建字典 - python

python - 创建一个 Pandas/NumPy 函数来查找系列中的值何时发生变化?

python - 类似的字符串,并希望在 python 中使用 RegEx、Pandas 创建 3 个单独的数据帧

report - Data Studio、报告级别不适用于日期范围控制

python pandas 计算数据框中日期范围的小时数