从pandas数据框中删除非工作日行

时间:2016-06-14 04:31:50

标签: python pandas

我有一个数据框,其中包含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);
                       }
                   });
        }
    }
}

4 个答案:

答案 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]