当前位置: 首页 > 知识库问答 >
问题:

熊猫当月工作日股价数据

祁英哲
2023-03-14

上面的问题是假设一周有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

如果你发现这个问题有任何问题,或者它是重复的,请告诉我。我已经寻找了一段时间的解决办法。

共有1个答案

齐凯康
2023-03-14

一种方法是使用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)

然后你得到

#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

注意:有一点要知道,OpexWeek之前的周六和周日是真的,但因为你说你的数据是工作日,所以这不应该有什么关系。

def OpexWeekPd (ser):
    return (ser+pd.to_timedelta((4-ser.dt.weekday)%7, unit='d')).dt.day.between(15,21)
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
 类似资料:
  • 问题内容: 我最终在写出这个问题的时候就弄清楚了,所以无论如何我都会发布并回答我自己的问题,以防别人需要一点帮助。 问题 假设我们有一个,包含该数据。 目标 对于每一行,将 其一个月*以内的每一行的总和相加,最好使用一种非常干净的语法。 * 我尝试过的 但这引发了异常 版: 问题答案: 使用偏移量而不是专门使用30天或大约一个月。 最初,我凭直觉跳了起来,使用了一个月,但现在很清楚为什么不起作用。

  • 在学习熊猫的过程中,我已经尝试了好几个月来找出这个问题的答案。我在日常工作中使用SAS,这是非常好的,因为它提供了非核心支持。然而,SAS作为一个软件是可怕的,原因还有很多。 有一天,我希望用python和pandas取代SAS的使用,但我目前缺乏大型数据集的核心外工作流。我说的不是需要分布式网络的“大数据”,而是文件太大而无法放入内存,但又太小而无法装入硬盘。 我的第一个想法是使用将大型数据集保

  • 问题内容: 我试图弄清楚如何在Pandas数据框中的日期中添加3个月,同时将其保持为日期格式,因此可以使用它来查找范围。 这是我尝试过的: 但是,出现以下错误: 问题答案: 你可以用 另一种使用方式 细节

  • 问题内容: 如何获得当月的第一个工作日?如果不创建函数,则仅选择。像这样的东西: 有人知道吗? 谢谢。 问题答案: 一个简单的案例陈述就可以做到

  • 问题内容: 我正在做一些地理编码工作,我曾用它来屏幕刮取位置地址所需的xy坐标,我将xls文件导入了panda数据框,并希望使用显式循环来更新没有xy坐标的行,例如下面: 我已经阅读了为什么在遍历熊猫DataFrame之后该功能不能“使用”?并且完全意识到,iterrow仅提供给我们一个视图,而不是一个供编辑的副本,但是如果我真的要逐行更新值怎么办?是否可行? 问题答案: 您从中获得的行是不再连接

  • 首先,我对Python完全是新手,所以,也许是一些非常简单的事情我做得不对。 我正在读取一个多工作表xlsx文件,并将每个文件发送到单独的数据帧。(至少,我认为我正在这么做)。 这就是结果。 然后,我尝试打印每个df的一些列(手动尝试) 但我得到的只是: 正在显示任何值 如果我只调用,我会得到以下结果: 我做错了什么? 随着时间的推移,这是一项重大工作的一部分。我要做的就是过滤所有工作表的一些列,