我有一个每分钟、每天 24 小时、每天、一个月的外汇价格数据集。然而,外汇市场实际上只在周日 17:00 至周五 16:00 开放,这期间的数据只是用周五晚上的最后记录值填充。我正在尝试删除此填充并仅保留市场开放数据。
我已经走了几十个死胡同,完全失去了树木的木材。
根据指定的时间范围返回数据的子集非常简单:
import pandas as pd
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True)
# Return all rows for times between 12:00 and 16:00
df = df.between_time('12:00','16:00')
前两行从 csv 文件创建数据框,将“dtime”列分配为索引并将其解析为日期时间对象。第三行返回 12:00 到 16:00 之间的所有行,无论是哪一天。
一个简单的单行解决方案看起来像(伪代码):
df = df.between_customTimeRange('Sun 17:00','Fri 16:00')
但显然,这是行不通的。
有没有我完全忽略的简单事情?
编辑: 我将 EKomarov 和 Alexander 的答案结合到以下解决方案中:
import pandas as pd
df = pd.read_csv(tickdatafile,index_col='dtime',parse_dates=True)
mask = df[ ( ( df.index.weekday == 6 ) & ( df.index.hour < 17 ) )# Sunday pre 17:00
| ( df.index.weekday == 5 ) # All of Saturday
| ( ( df.index.weekday == 4 ) # Friday
& ( ( df.index.hour >= 16 ) # Friday 16.00 onwards
& ~( ( df.index.hour == 16 )
& ( df.index.minute == 0 )# Exclude 16.00 itself
)
)
)
]
df = df[~df.index.isin(mask.index)] # return all data not in mask
df.to_csv(tradingdaysonly)