问题描述
我有一个大小为 nx 1 的日期时间对象的数组 A
和大小为 mx 1 的整数数组 B
。对于 A
中的每个日期,我想将其全部递增数组 B
中指定的工作日增量。
示例:
import numpy as np
from datetime import date
A = np.array([date(2021,6,1),date(2021,4)])
B = [0,1,2]
在这种情况下,所需的结果类似于:
2021-06-01 | 2021-06-02 | 2021-06-03 | |
2021-06-04 | 2021-06-07 | 2021-06-08 |
也就是说,一个大小为 n x m 的数组。对于第 i 行,A[i]
B
+ x 个工作日
该解决方案的关键要求是高效(矢量化?)。我将使用参数 m = 60,000 & n = 60 执行此操作 100 次。所以至少 O(10^8) 日期时间操作。
我的尝试:
我找到了 numpy 的 busday_offset 方法:https://numpy.org/doc/stable/reference/generated/numpy.busday_offset.html
看起来你可以为它提供数组,它会做一些矢量化的魔法。
我发现这有效:
np.busday_offset(datetime.date(2021,B)
但这不会:
np.busday_offset(A,B)
我收到错误“迭代器操作数或请求的数据类型包含引用,但未启用 REFS_OK 标志”
-- 编辑 --
解决方案
REFS_OK 标志错误是因为我已将 A
定义为包含对象类型的数组。如果正确定义 numpy 数组类型,并为工作日偏移数组设置正确的形状,则它可以工作:
A = np.array([date(2021,4)],dtype='datetime64')
B = np.array([[0],[1],[2]])
np.busday_offset(A,B)
按照问题规范的要求生成一个 3x2 矩阵。解决方案似乎也很快(确实,足够快,以至于它不再是我代码中的瓶颈)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)