2

我有一个每分钟、每天 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) 
4

2 回答 2

2

这是一个可能的解决方案。

我会减少处理不需要的时间戳的问题。那些“错误”的时间戳在 Fri-16:00 和 Sun-17:00 之间。

说你有

data = pd.Series( np.random.randn(100), index = pd.date_range('2015-04-01', periods = 100, freq = '6h') )

让我们找到“错误”的时间戳:

    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 为每个时间戳“错误”的整数位置包含 True,因此我们将其反转并查询数据:

nonPaddedData = data[~paddedTimestamps]
于 2015-04-12T15:50:04.300 回答
2

我使用与@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)]
于 2015-04-12T16:01:02.290 回答