将 N 个工作日添加到非单位 'D' 的 Numpy datetime64
Add N Business Days to a Numpy datetime64 That's Not of Unit 'D'
我正在尝试将工作日添加到当前格式为 datetime64
对象但类型为 'ns'
的一长串数据中。
根据 Numpy documentation,busday_offset
函数仅适用于单位为 'D'
的对象。我想要的功能存在于 Pandas 中,使用 'BusinessDayin
tseries.offsets`。
我可以将每个日期转换为 Pandas Timestamp
,然后添加偏移量,然后再转换回来,但感觉工作量比应有的多。
有没有办法直接将任意数量的工作日添加到具有 '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 实现。我最初从 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)
我正在尝试将工作日添加到当前格式为 datetime64
对象但类型为 'ns'
的一长串数据中。
根据 Numpy documentation,busday_offset
函数仅适用于单位为 'D'
的对象。我想要的功能存在于 Pandas 中,使用 'BusinessDayin
tseries.offsets`。
我可以将每个日期转换为 Pandas Timestamp
,然后添加偏移量,然后再转换回来,但感觉工作量比应有的多。
有没有办法直接将任意数量的工作日添加到具有 '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 实现。我最初从 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)