Python 将N个工作日添加到';s不是单位';D';

Python 将N个工作日添加到';s不是单位';D';,python,datetime,pandas,numpy,numpy-ufunc,Python,Datetime,Pandas,Numpy,Numpy Ufunc,我试图将工作日添加到一长串数据中,这些数据当前的格式为datetime64对象,但类型为'ns' 根据Numpy,busday\u offset功能仅适用于单位为'D'的对象。我想要的功能存在于Pandas中,在tseries.offset`中使用“businessday” 我可以将每个日期转换成一个时间戳,然后添加偏移量,然后再转换回来,但这感觉比它应该做的更多 有没有一种方法可以直接向具有'ns'单位的datetime64对象添加任意数量的工作日 a = pd.date_range('201

我试图将工作日添加到一长串数据中,这些数据当前的格式为
datetime64
对象,但类型为
'ns'

根据Numpy,busday\u offset功能仅适用于单位为
'D'
的对象。我想要的功能存在于Pandas中,在tseries.offset`中使用“businessday

我可以将每个日期转换成一个时间戳,然后添加偏移量,然后再转换回来,但这感觉比它应该做的更多

有没有一种方法可以直接向具有
'ns'
单位的
datetime64
对象添加任意数量的工作日

a = pd.date_range('2016-03-31', periods=5, freq='M').values
a

array(['2016-03-31T00:00:00.000000000', '2016-04-30T00:00:00.000000000',
       '2016-05-31T00:00:00.000000000', '2016-06-30T00:00:00.000000000',
       '2016-07-31T00:00:00.000000000'], dtype='datetime64[ns]')

pd.to_datetime(a) + pd.offsets.BusinessDay(8)

DatetimeIndex(['2016-04-12', '2016-05-11', '2016-06-10', '2016-07-12',
               '2016-08-10'],
              dtype='datetime64[ns]', freq=None)
或者,如果您希望它们位于
datetime64[ns]

(pd.to_datetime(a) + pd.offsets.BusinessDay(8)).values

array(['2016-04-12T00:00:00.000000000', '2016-05-11T00:00:00.000000000',
       '2016-06-10T00:00:00.000000000', '2016-07-12T00:00:00.000000000',
       '2016-08-10T00:00:00.000000000'], dtype='datetime64[ns]')

使用pandas要容易得多,但这里有一个numpy实现。我最初是用熊猫制作日期的,但这不是必须的。任何具有ns精度的numpy日期都应该有效

# get numpy only business days from pandas
pandas_dates = pd.date_range('today', periods=10, freq='B')
np_dates = pandas_dates.values

# Just get the day part
np_days = np_dates.astype('datetime64[D]')

# offset date using numpy and then convert back to ns precision.
# all seconds will be 0
np_day_offsets = np.busday_offset(np_days, 5).astype('datetime64[ns]')

# add back in nanoseconds
np_final = np_day_offsets + (np_dates - np_days)

你可以只使用微秒的精度,然后再加上纳秒。你真的需要纳秒吗?不幸的是,为了向后兼容,我需要纳秒。我很想使用熊猫,但不幸的是它需要在numpy中。这是一个纯numpy解决方案。我只是用熊猫来做假约会。从
np_dates
中的数据开始,就可以了。