我有一个数据框,其中包含df = wt["WHEAT_USD"]
2016-05-02 02:00:00+02:00 4.780
2016-05-02 02:01:00+02:00 4.777
2016-05-02 02:02:00+02:00 4.780
2016-05-02 02:03:00+02:00 4.780
2016-05-02 02:04:00+02:00 4.780
Name: closeAsk, dtype: float64
中小麦的第二个时间序列数据。
df = df.BDays()
当我绘制数据时,由于周末的原因,它会让人烦恼。有没有简单的方法可以简单地从数据框本身中删除非工作日。
像
这样的东西public class RemoteServiceEndpointReference {
private static final boolean USING_LOCAL_SERVER = false;
private static final String LOCAL_SERVER_PATH = “…”;
private static RemoteService service;
public static RemoteService getRemoteServiceEndpoint() {
if (null != service) {
return service;
}
RemoteService.Builder builder = new RemoteService.Builder(
AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(),
null
);
forLocalServer(builder);
service = builder.build();
return service;
}
private static void forLocalServer(AbstractGoogleJsonClient.Builder builder) {
if (USING_LOCAL_SERVER) {
builder.setRootUrl(LOCAL_SERVER_PATH)
.setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {
@Override
public void initialize(AbstractGoogleClientRequest<?> request) throws IOException {
request.setDisableGZipContent(true);
}
});
}
}
}
答案 0 :(得分:25)
一个简单的解决方案是在周一到周五之间分割出日子:
In [11]: s[s.index.dayofweek < 5]
Out[11]:
2016-05-02 00:00:00 4.780
2016-05-02 00:01:00 4.777
2016-05-02 00:02:00 4.780
2016-05-02 00:03:00 4.780
2016-05-02 00:04:00 4.780
Name: closeAsk, dtype: float64
注意:这不考虑银行假期等。
答案 1 :(得分:4)
Pandas BDay
最终会使用.dayofweek<5
,就像选择的答案一样,但可以延长到银行假期等等。
import pandas as pd
from pandas.tseries.offsets import BDay
isBusinessDay = BDay().onOffset
csv_path = 'C:\\Python27\\Lib\\site-packages\\bokeh\\sampledata\\daylight_warsaw_2013.csv'
dates_df = pd.read_csv(csv_path)
match_series = pd.to_datetime(dates_df['Date']).map(isBusinessDay)
dates_df[match_series]
答案 2 :(得分:1)
我正在为股票/外汇交易建立一个回测器,并且由于假期或其他非交易日的影响,我也遇到了这些问题。 您可以下载没有交易日的财务日历,然后需要考虑时区和周末等等。
但是最好的解决方案是不要使用日期/时间作为蜡烛或价格的指数。 因此,请勿将价格数据连接到日期/时间,而只能将其连接到蜡烛或价格的计数器上。您可以为此使用第二个索引。 因此,对于MA或其他技术线的计算,请勿使用日期/时间.. 如果您查看Metatrader 4/5,它也不使用日期/时间,但数据的索引是蜡烛号!
我认为,如果您使用股票或外汇数据,则需要放弃价格的日期时间,因为您可以将它们放在数据框的列中,但不要将其用作索引 这样,您可以避免很多问题
答案 3 :(得分:0)
使用工作日,您可以轻松地算作假期
import workdays as wd
def drop_non_busdays(df, holidays=None):
if holidays is None:
holidays = []
start_date = df.index.to_list()[0].date()
end_date = df.index.to_list()[-1].date()
start_wd = wd.workday(wd.workday(start_date, -1, holidays), 1, holidays)
end_wd = wd.workday(wd.workday(end_date, 1, holidays), -1, holidays)
b_days = [start_wd]
while b_days[-1] < end_wd:
b_days.append(wd.workday(b_days[-1], 1, holidays))
valid = [i in b_days for i in df.index]
return df[valid]