Pandas 每月营业日股价数据

use*_*440 5 python datetime pandas

我的问题与以下不同:

问题1:在一个月的周大熊猫 Quesiton2:这个月的周数

上述问题涉及假设一周有 7 天。它试图计算每周 7 天的数量。我的数据由(工作日)每日价格组成,由于市场因假期休市,因此有时可能会缺少一周中的几天。

我的问题是如何找到给定日期的月份中的第几周。注意我强调了“给定日期”,因为这个过程每天都在处理,所以任何展望月底之前的答案都可能不起作用。

我的尝试是展望不是最佳的:

def is_third_friday(s):
    d = datetime.datetime.strptime(s, '%Y-%m-%d')
    return d.weekday() == 5 and 15 <= d.day <= 21

dow = deepcopy(data['Close'] * np.nan).to_frame()
dow.columns = ['OpexFriday']
dow['next_date'] = pd.Series([str(i.date() + datetime.timedelta(days=1)) for i in dow.index]).values
dow['OpexFriday'] = pd.Series([is_third_friday(str(i)) for i in dow['next_date']]).values
dow['OpexWeek'] = (dow['OpexFriday'] * 1).replace(0, np.nan).fillna(method='bfill', limit=4).replace(np.nan, 0) == True
Run Code Online (Sandbox Code Playgroud)

我不知道如何提供一些样本,data但是如果您转到“https://aroussi.com/post/python-yahoo-finance”页面并使用作者 yfinance 包,您将能够获得一些价格数据与。

上面的函数将找到该月的第 3 周(全部为 True)。此外,它还将设置该周的星期五。

如果您发现该问题有任何问题或是否重复,请告诉我。我已经搜索了一段时间以寻找解决方案。

Ben*_*n.T 3

一种方法是将任意timedelta日期更改为下周五,然后检查下周五是否在 15 到 21 之间。

from datetime import datetime, timedelta
def OpexWeek (s):
    d = datetime.strptime(s, '%Y-%m-%d')
    day = (d+timedelta(days=(4-d.weekday())%7)).day
    return (day>=15) & (day<=21)
Run Code Online (Sandbox Code Playgroud)

然后你得到

#for the example the second Friday of June 2020:
OpexWeek('2020-06-12')
False

# the Monday after is True because part of the OpexWeek
OpexWeek('2020-06-15')
True
Run Code Online (Sandbox Code Playgroud)

注意:要知道的一件事是 OpexWeek 之前的星期六和星期日是 True,但因为您说您的数据是工作日,所以这应该不重要。

用于日期时间系列的 pandas 版本可能是:

def OpexWeekPd (ser):
    return (ser+pd.to_timedelta((4-ser.dt.weekday)%7, unit='d')).dt.day.between(15,21)
Run Code Online (Sandbox Code Playgroud)

举个小例子:

print (
    pd.DataFrame({'date':pd.bdate_range('2020-06-01', '2020-06-30').astype(str)})
      .assign(isOpexWeek=lambda x: x['date'].apply(OpexWeek), 
              isIpexWeekPd=lambda x: OpexWeekPd(pd.to_datetime(x['date'])))
    )
          date  isOpexWeek  isIpexWeekPd
0   2020-06-01       False         False
1   2020-06-02       False         False
2   2020-06-03       False         False
3   2020-06-04       False         False
4   2020-06-05       False         False
5   2020-06-08       False         False
6   2020-06-09       False         False
7   2020-06-10       False         False
8   2020-06-11       False         False
9   2020-06-12       False         False
10  2020-06-15        True          True
11  2020-06-16        True          True
12  2020-06-17        True          True
13  2020-06-18        True          True
14  2020-06-19        True          True
15  2020-06-22       False         False
16  2020-06-23       False         False
17  2020-06-24       False         False
18  2020-06-25       False         False
19  2020-06-26       False         False
20  2020-06-29       False         False
21  2020-06-30       False         False
Run Code Online (Sandbox Code Playgroud)