python - pd.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
in过滤掉这些值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)
推荐阅读
- c# - C# .NetTcpBinding 2 服务在同一端口 5000
- dart - 如何在一个语句中按多个级别对 angular dart 中的列表进行排序?
- javascript - 单击或按下空格键时启动/停止 Cube Timer
- r - 是否有一个 R 函数可以在缺少某些年份时通过在国家/地区分组来帮助将变量滞后一年?
- mysql - “设置foreign_key_checks = 0;” 但仅适用于一个数据库
- c - 无法将整数数组作为参数传递给本地参数为字符指针的函数
- javascript - React Bootstrap typeahead 无法正确显示选项
- java - Android Studio - 有没有办法检查设备当前是否连接到蓝牙设备?
- spring-boot - spring-boot-maven-plugin:build-image 失败并出现 400 Bad Request
- python - 如何在 discord.py v1.4.1 的嵌入中编辑每 10 秒的剩余时间