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



我有一个数据帧,其中包含df小麦的时间序列数据。

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()

一个简单的解决方案是将周一到周五以外的天数切掉:

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

注意:这不包括银行假期等。

熊猫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]

我正在为股票/外汇交易构建一个回溯测试器,我对 nan 的日子也有这些问题,因为它们是假期或其他非交易日。您可以下载没有交易的日子的财经日历,然后您需要考虑时区和周末。等。。

但最好的解决方案是不要使用日期/时间作为蜡烛或价格的指数。因此,不要将您的价格数据连接到日期/时间,而只是连接到蜡烛或价格的计数器。您可以为此使用第二个索引。因此,对于MA或其他技术线的计算,不要使用日期/时间..如果您查看 Metatrader 4/5,它也不使用日期/时间,但数据的索引是蜡烛数!

我认为,如果您处理股票或外汇数据,则需要放弃价格的日期时间,因为您可以将它们放在数据框的一列中,但不将其用作索引这样您可以避免许多问题

使用工作日,您可以轻松计算假期

    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]

在 Hayden 解决方案的基础上@Andy您还可以将querydataframe一起使用,以"现代熊猫"的方式更好地链接方法。

如果日期是一列(例如,并命名为 my_date

df.query("my_date.dt.dayofweek < 5")

如果日期是索引并且具有名称(例如 my_index_namedate

df.query("my_index_name.dt.dayofweek < 5")

如果日期是索引并且没有名称

df.rename_axis("date").query("date.dt.dayofweek < 5")

index.dt.dayofweekindex.dayofweek对我不起作用)。

简单地说,过滤可以按日期名称完成。例如,如果你不想要星期六和星期日,你可以使用它:

df=df[(df['date'].dt.day_name()!='Saturday') & (df['date'].dt.day_name()!='Sunday')]

不适用于特殊假期等

最新更新