我有一个外汇价格数据集,每天24小时,每天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' column作为索引并将其解析为datetime对象。 第三行返回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)
答案 0 :(得分:1)
这是一个可能的解决方案。
我将处理不需要的时间戳的问题减少了。那些,&#34;错误&#34;时间戳,介于星期五至下午16:00至星期日17:00之间。
说你有
data = pd.Series( np.random.randn(100), index = pd.date_range('2015-04-01', periods = 100, freq = '6h') )
让我们发现&#34;错误&#34;时间戳:
paddedTimestamps = ( ( (data.index.dayofweek == 4) & (data.index.time > datetime.time(16,0)) ) |
(data.index.dayofweek == 5) |
( (data.index.dayofweek == 6) & (data.index.time < datetime.time(17,0)) ) )
现在paddedTimestamps对于时间戳为&#34;错误&#34;的每个整数位置都包含True,所以我们将其反转并查询数据:
nonPaddedData = data[~paddedTimestamps]
答案 1 :(得分:1)
我使用的方法与@EKomarov相同,但处理时间不同。 Stamps是你的pd.Timestamp索引。首先创建您不想要的日期/时间的掩码,然后将其反转。请注意,dayofweek的索引为Monday = 0和Sunday = 6.
mask = stamps[((stamps.dayofweek == 6) & (stamps.hour < 17)) # Sunday before 17:00
| (stamps.dayofweek == 5) # All of Saturday
| ((stamps.dayofweek == 4) # Friday after 16:00
& (stamps.hour >= 16)
& ~((stamps.hour == 16) & (stamps.minute == 0)))] # Exclude 16:00
stamps[~stamps.isin(mask)]