将N个工作日添加到Numpy datetime64那不是单位'D'

时间:2016-12-21 23:56:03

标签: python datetime pandas numpy numpy-ufunc

我正在尝试将工作日添加到当前格式为datetime64个对象的长数据列表中,但类型为'ns'

根据Numpy documentationbusday_offset函数仅适用于单位为'D'的对象。我想要的功能存在于Pandas中,使用'BusiniessDay in tseries.offsets`。

我可以将每个日期转换为Pandas Timestamp,然后添加偏移量,然后转换回来,但这感觉就像应该做的更多的工作。

有没有办法直接向具有datetime64单位的'ns'对象添加任意数量的工作日?

2 个答案:

答案 0 :(得分:2)

使用pandas要容易得多,但这是一个非常简单的实现。我最初是从熊猫创建日期,但这不是必需的。任何具有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)

答案 1 :(得分:1)

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]')