【发布时间】:2019-08-21 18:07:18
【问题描述】:
我想在跳过非交易时间(工作日下午 5 点至下午 6 点,周六至周日下午 6 点)的同时创建一个从当前时间开始的接下来四个小时的交易数据的运行数据框。例如,周五下午 4 点,我想要一个从周五下午 4 点到下午 5 点,然后在周日下午 6 点到 9 点运行的数据框。
目前,我正在使用以下内容:
time_parameter = pd.Timedelta(hours=4) #Set time difference to four hours
df = df.set_index(['Time'])
for current_time, row in df.iterrows(): #df is the entire trading data df
future_time = current_time + time_parameter
temp_df = df.loc[current_time : future_time]
这显然不会跳过非交易时间,所以我试图找到一种有效的方法来做到这一点。
我可以使用的一种方法是创建一组非交易时间,检查当前时间范围 (current_time:future_time) 是否包括任何时间,并为每个时间添加额外的时间。
但是,由于数据集大约有 350 万行,并且需要对每一行进行此检查,我想问是否有人知道更快的方法?
简而言之,寻找一种将 4 个工作时间(周日至周五下午 6 点至下午 5 点)添加到当前时间的方法。谢谢!
Input Data: This shows the first 19 rows of the trading data
解决方案
根据下面代码不同的答案,我使用了以下内容:
def last_trading_hour(start_time, time_parameter, periods_parameter):
start_series = pd.date_range(start_time, freq='H', periods = periods_parameter)
mask = (((start_series.dayofweek == 6) & (time_2(18) <= start_series.time)) #Sunday: After 6pm
| ((start_series.dayofweek == 4) & (start_series.time < time_2(17))) #Friday before 5pm
| ((start_series.dayofweek < 4) & (start_series.time < time_2(17))) #Mon-Thur before 5pm
| ((start_series.dayofweek < 4) & (time_2(18) <= start_series.time)) #Mon-Thur after 6pm
)
return start_series[mask][time_parameter]
start_time = pd.Timestamp('2019-08-16 13:00:10')
time_parameter = 4 #Adding 4 hours to time
periods_parameter = 49 + time_parameter #Max 49 straight hours of no-trades (Fri 5pm-Sun 6pm)
last_trading_hour(start_time, time_parameter, periods_parameter)
结果:
Timestamp('2019-08-18 18:00:10')
如果你需要整个系列,请按照 Code Different 的方法进行索引。
【问题讨论】:
-
欢迎来到 StackOverflow。请按照您创建此帐户时的建议遵循帮助文档中的发布指南。 On topic、how to ask 和 ...the perfect question 在此处申请。 StackOverflow 不是设计、编码、研究或教程资源。向我们展示您的输入、输出和编码尝试?