如何仅掩盖最近的日期?
假设我有2天的日期时间:
import pandas as pd
import numpy as np
index = pd.date_range("2020-01-01 00:00:00", "2020-01-03 00:00:00", freq="15T")
print(index)
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 00:15:00',
'2020-01-01 00:30:00', '2020-01-01 00:45:00',
'2020-01-01 01:00:00', '2020-01-01 01:15:00',
'2020-01-01 01:30:00', '2020-01-01 01:45:00',
'2020-01-01 02:00:00', '2020-01-01 02:15:00',
...
'2020-01-02 21:45:00', '2020-01-02 22:00:00',
'2020-01-02 22:15:00', '2020-01-02 22:30:00',
'2020-01-02 22:45:00', '2020-01-02 23:00:00',
'2020-01-02 23:15:00', '2020-01-02 23:30:00',
'2020-01-02 23:45:00', '2020-01-03 00:00:00'],
dtype='datetime64[ns]', length=193, freq='15T')
然后我根据我的索引声明一个熊猫阵列,每个元素设置为false:
entries = pd.Series(False, index=index)
然后我获得市场时间和开放时间:
market_hours_indices = entries.index.indexer_between_time('9:30', '16:00')
market_hours_index = entries.index[market_hours_indices]
open_hours_indices = entries.index.indexer_between_time('9:30', '10:30')
open_hours_index = entries.index[open_hours_indices]
然后用我的初始熊猫阵列掩盖我的初始熊猫阵列索引:
entries = entries[market_hours_index]
entries[~entries.index.isin(open_hours_index)] = False
entries
这给了我:
2020-01-01 09:30:00 True
2020-01-01 09:45:00 True
2020-01-01 10:00:00 True
2020-01-01 10:15:00 True
2020-01-01 10:30:00 True
2020-01-01 10:45:00 False
2020-01-01 11:00:00 False
2020-01-01 11:15:00 False
2020-01-01 11:30:00 False
2020-01-01 11:45:00 False
2020-01-01 12:00:00 False
2020-01-01 12:15:00 False
2020-01-01 12:30:00 False
2020-01-01 12:45:00 False
2020-01-01 13:00:00 False
2020-01-01 13:15:00 False
2020-01-01 13:30:00 False
2020-01-01 13:45:00 False
2020-01-01 14:00:00 False
2020-01-01 14:15:00 False
2020-01-01 14:30:00 False
2020-01-01 14:45:00 False
2020-01-01 15:00:00 False
2020-01-01 15:15:00 False
2020-01-01 15:30:00 False
2020-01-01 15:45:00 False
2020-01-01 16:00:00 False
2020-01-02 09:30:00 True
2020-01-02 09:45:00 True
2020-01-02 10:00:00 True
2020-01-02 10:15:00 True
2020-01-02 10:30:00 True
2020-01-02 10:45:00 False
2020-01-02 11:00:00 False
2020-01-02 11:15:00 False
2020-01-02 11:30:00 False
2020-01-02 11:45:00 False
2020-01-02 12:00:00 False
2020-01-02 12:15:00 False
2020-01-02 12:30:00 False
2020-01-02 12:45:00 False
2020-01-02 13:00:00 False
2020-01-02 13:15:00 False
2020-01-02 13:30:00 False
2020-01-02 13:45:00 False
2020-01-02 14:00:00 False
2020-01-02 14:15:00 False
2020-01-02 14:30:00 False
2020-01-02 14:45:00 False
2020-01-02 15:00:00 False
2020-01-02 15:15:00 False
2020-01-02 15:30:00 False
2020-01-02 15:45:00 False
2020-01-02 16:00:00 False
dtype: bool
我的目标几乎是我要做的,但是我只针对第二天呢?使我的数组看起来像:
2020-01-01 09:30:00 False
2020-01-01 09:45:00 False
2020-01-01 10:00:00 False
2020-01-01 10:15:00 False
2020-01-01 10:30:00 False
2020-01-01 10:45:00 False
2020-01-01 11:00:00 False
2020-01-01 11:15:00 False
2020-01-01 11:30:00 False
2020-01-01 11:45:00 False
2020-01-01 12:00:00 False
2020-01-01 12:15:00 False
2020-01-01 12:30:00 False
2020-01-01 12:45:00 False
2020-01-01 13:00:00 False
2020-01-01 13:15:00 False
2020-01-01 13:30:00 False
2020-01-01 13:45:00 False
2020-01-01 14:00:00 False
2020-01-01 14:15:00 False
2020-01-01 14:30:00 False
2020-01-01 14:45:00 False
2020-01-01 15:00:00 False
2020-01-01 15:15:00 False
2020-01-01 15:30:00 False
2020-01-01 15:45:00 False
2020-01-01 16:00:00 False
2020-01-02 09:30:00 True
2020-01-02 09:45:00 True
2020-01-02 10:00:00 True
2020-01-02 10:15:00 True
2020-01-02 10:30:00 True
2020-01-02 10:45:00 False
2020-01-02 11:00:00 False
2020-01-02 11:15:00 False
2020-01-02 11:30:00 False
2020-01-02 11:45:00 False
2020-01-02 12:00:00 False
2020-01-02 12:15:00 False
2020-01-02 12:30:00 False
2020-01-02 12:45:00 False
2020-01-02 13:00:00 False
2020-01-02 13:15:00 False
2020-01-02 13:30:00 False
2020-01-02 13:45:00 False
2020-01-02 14:00:00 False
2020-01-02 14:15:00 False
2020-01-02 14:30:00 False
2020-01-02 14:45:00 False
2020-01-02 15:00:00 False
2020-01-02 15:15:00 False
2020-01-02 15:30:00 False
2020-01-02 15:45:00 False
2020-01-02 16:00:00 False
dtype: bool
我尝试过的:
# get the days I'm interested in
df_all_days = df[(df['date'] >= previous_day) & (df['date'] <= date)]
# get the day I want to trade
df_current_day = df[df['date'] == date]
current_day_index = df_current_day.index
# create an empty numpy array
entries = pd.Series(True, index=current_day_index)
# get the index of the current day between trading hours
market_hours_indices = entries.index.indexer_between_time('9:30', '16:00')
market_hours_index = entries.index[market_hours_indices]
# return False any dates and times which fall outside of our date
df_all_days['enter'] = df_all_days['enter'][~df_all_days['enter'].index.isin(market_hours_index)] = False
这是返回(所有false):
2022-06-15 07:16:00 False
2022-06-15 09:17:00 False
2022-06-15 09:18:00 False
2022-06-15 09:19:00 False
...
2022-06-16 19:59:00 False
Name: enter, dtype: bool
Let's say I have 2 days worth of date times:
import pandas as pd
import numpy as np
index = pd.date_range("2020-01-01 00:00:00", "2020-01-03 00:00:00", freq="15T")
print(index)
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 00:15:00',
'2020-01-01 00:30:00', '2020-01-01 00:45:00',
'2020-01-01 01:00:00', '2020-01-01 01:15:00',
'2020-01-01 01:30:00', '2020-01-01 01:45:00',
'2020-01-01 02:00:00', '2020-01-01 02:15:00',
...
'2020-01-02 21:45:00', '2020-01-02 22:00:00',
'2020-01-02 22:15:00', '2020-01-02 22:30:00',
'2020-01-02 22:45:00', '2020-01-02 23:00:00',
'2020-01-02 23:15:00', '2020-01-02 23:30:00',
'2020-01-02 23:45:00', '2020-01-03 00:00:00'],
dtype='datetime64[ns]', length=193, freq='15T')
And then I declare a pandas array based on my index with each element set to False:
entries = pd.Series(False, index=index)
I then get the market times, and the open times:
market_hours_indices = entries.index.indexer_between_time('9:30', '16:00')
market_hours_index = entries.index[market_hours_indices]
open_hours_indices = entries.index.indexer_between_time('9:30', '10:30')
open_hours_index = entries.index[open_hours_indices]
And then mask my initial pandas array with my indexs:
entries = entries[market_hours_index]
entries[~entries.index.isin(open_hours_index)] = False
entries
This gives me:
2020-01-01 09:30:00 True
2020-01-01 09:45:00 True
2020-01-01 10:00:00 True
2020-01-01 10:15:00 True
2020-01-01 10:30:00 True
2020-01-01 10:45:00 False
2020-01-01 11:00:00 False
2020-01-01 11:15:00 False
2020-01-01 11:30:00 False
2020-01-01 11:45:00 False
2020-01-01 12:00:00 False
2020-01-01 12:15:00 False
2020-01-01 12:30:00 False
2020-01-01 12:45:00 False
2020-01-01 13:00:00 False
2020-01-01 13:15:00 False
2020-01-01 13:30:00 False
2020-01-01 13:45:00 False
2020-01-01 14:00:00 False
2020-01-01 14:15:00 False
2020-01-01 14:30:00 False
2020-01-01 14:45:00 False
2020-01-01 15:00:00 False
2020-01-01 15:15:00 False
2020-01-01 15:30:00 False
2020-01-01 15:45:00 False
2020-01-01 16:00:00 False
2020-01-02 09:30:00 True
2020-01-02 09:45:00 True
2020-01-02 10:00:00 True
2020-01-02 10:15:00 True
2020-01-02 10:30:00 True
2020-01-02 10:45:00 False
2020-01-02 11:00:00 False
2020-01-02 11:15:00 False
2020-01-02 11:30:00 False
2020-01-02 11:45:00 False
2020-01-02 12:00:00 False
2020-01-02 12:15:00 False
2020-01-02 12:30:00 False
2020-01-02 12:45:00 False
2020-01-02 13:00:00 False
2020-01-02 13:15:00 False
2020-01-02 13:30:00 False
2020-01-02 13:45:00 False
2020-01-02 14:00:00 False
2020-01-02 14:15:00 False
2020-01-02 14:30:00 False
2020-01-02 14:45:00 False
2020-01-02 15:00:00 False
2020-01-02 15:15:00 False
2020-01-02 15:30:00 False
2020-01-02 15:45:00 False
2020-01-02 16:00:00 False
dtype: bool
Which is almost what I'm aiming to do, but how do I only target the second day? So that my array looks like:
2020-01-01 09:30:00 False
2020-01-01 09:45:00 False
2020-01-01 10:00:00 False
2020-01-01 10:15:00 False
2020-01-01 10:30:00 False
2020-01-01 10:45:00 False
2020-01-01 11:00:00 False
2020-01-01 11:15:00 False
2020-01-01 11:30:00 False
2020-01-01 11:45:00 False
2020-01-01 12:00:00 False
2020-01-01 12:15:00 False
2020-01-01 12:30:00 False
2020-01-01 12:45:00 False
2020-01-01 13:00:00 False
2020-01-01 13:15:00 False
2020-01-01 13:30:00 False
2020-01-01 13:45:00 False
2020-01-01 14:00:00 False
2020-01-01 14:15:00 False
2020-01-01 14:30:00 False
2020-01-01 14:45:00 False
2020-01-01 15:00:00 False
2020-01-01 15:15:00 False
2020-01-01 15:30:00 False
2020-01-01 15:45:00 False
2020-01-01 16:00:00 False
2020-01-02 09:30:00 True
2020-01-02 09:45:00 True
2020-01-02 10:00:00 True
2020-01-02 10:15:00 True
2020-01-02 10:30:00 True
2020-01-02 10:45:00 False
2020-01-02 11:00:00 False
2020-01-02 11:15:00 False
2020-01-02 11:30:00 False
2020-01-02 11:45:00 False
2020-01-02 12:00:00 False
2020-01-02 12:15:00 False
2020-01-02 12:30:00 False
2020-01-02 12:45:00 False
2020-01-02 13:00:00 False
2020-01-02 13:15:00 False
2020-01-02 13:30:00 False
2020-01-02 13:45:00 False
2020-01-02 14:00:00 False
2020-01-02 14:15:00 False
2020-01-02 14:30:00 False
2020-01-02 14:45:00 False
2020-01-02 15:00:00 False
2020-01-02 15:15:00 False
2020-01-02 15:30:00 False
2020-01-02 15:45:00 False
2020-01-02 16:00:00 False
dtype: bool
What I've tried:
# get the days I'm interested in
df_all_days = df[(df['date'] >= previous_day) & (df['date'] <= date)]
# get the day I want to trade
df_current_day = df[df['date'] == date]
current_day_index = df_current_day.index
# create an empty numpy array
entries = pd.Series(True, index=current_day_index)
# get the index of the current day between trading hours
market_hours_indices = entries.index.indexer_between_time('9:30', '16:00')
market_hours_index = entries.index[market_hours_indices]
# return False any dates and times which fall outside of our date
df_all_days['enter'] = df_all_days['enter'][~df_all_days['enter'].index.isin(market_hours_index)] = False
This returns (everything false):
2022-06-15 07:16:00 False
2022-06-15 09:17:00 False
2022-06-15 09:18:00 False
2022-06-15 09:19:00 False
...
2022-06-16 19:59:00 False
Name: enter, dtype: bool
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我发现了:
I figured it out: