我有一个数据帧,其中包含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您还可以将query
与dataframe
一起使用,以"现代熊猫"的方式更好地链接方法。
如果日期是一列(例如,并命名为 my_date
)
df.query("my_date.dt.dayofweek < 5")
如果日期是索引并且具有名称(例如 my_index_name
或date
)
df.query("my_index_name.dt.dayofweek < 5")
如果日期是索引并且没有名称
df.rename_axis("date").query("date.dt.dayofweek < 5")
(index.dt.dayofweek
或index.dayofweek
对我不起作用)。
简单地说,过滤可以按日期名称完成。例如,如果你不想要星期六和星期日,你可以使用它:
df=df[(df['date'].dt.day_name()!='Saturday') & (df['date'].dt.day_name()!='Sunday')]
不适用于特殊假期等