将numpy.busday_offset用于pandas.DateTimeIndex时遇REFS_OK flag错误的解决方法
解决numpy.busday_offset处理pandas日期数组的TypeError问题
错误原因:pd.to_datetime(...).date返回的是dtype为object的numpy数组,数组元素是Python原生的datetime.date对象。numpy的busday_offset无法直接处理这种包含引用类型的object数组,因此抛出该错误。
以下是三种可行的解决办法:
方法一:直接使用datetime64类型数组(推荐)
利用pd.to_datetime返回的DateTimeIndex本身就是numpy datetime64[ns]类型的特性,直接提取其底层数组传入busday_offset:
import numpy as np import pandas as pd dates = pd.to_datetime(['2008-01-01', '2008-01-02']) result = np.busday_offset(dates.values, 0) # 输出:array(['2008-01-01', '2008-01-02'], dtype='datetime64[D]')
方法二:将object数组转换为datetime64类型
如果已经生成了包含datetime.date对象的object数组,可显式转换为numpy原生的日期类型:
import numpy as np import pandas as pd date_array = pd.to_datetime(['2008-01-01', '2008-01-02']).date # 转换为datetime64[D](天精度)类型 np_dates = np.array(date_array, dtype='datetime64[D]') result = np.busday_offset(np_dates, 0)
方法三:使用pandas内置工作日处理替代
若无需依赖numpy函数,可直接用pandas的日期工具实现相同逻辑:
import pandas as pd from pandas.tseries.offsets import BusinessDay dates = pd.to_datetime(['2008-01-01', '2008-01-02']) # 偏移0个工作日(等同于保留原工作日) result = dates + BusinessDay(n=0) # 输出:DatetimeIndex(['2008-01-01', '2008-01-02'], dtype='datetime64[ns]', freq='B')
内容的提问来源于stack exchange,提问作者Lei Hao
相关产品推荐
相关产品推荐

