2016-12-21 13 views
2

datetime64のオブジェクトで、タイプが'ns'の現在の長いリストに営業日を追加しようとしています。ナンディ日時にN営業日を追加します.Dのユニットではありません

Numpy documentationによると、busday_offset関数は、単位が'D'のオブジェクトに対してのみ機能します。私が望む機能は、 'BusiniessDay in tseries.offsets`を使ってパンダに存在します。

すべての日付をPandas Timestampに変換してからオフセットを追加して元に戻すことができましたが、それよりも多くの作業が必要です。

'ns'単位のdatetime64オブジェクトに任意の営業日を直接追加する方法はありますか?

+0

マイクロ秒までの精度を使用して、ナノ秒を戻すことができますか?ナノ秒が本当に必要ですか? –

+0

残念ながら、下位互換性のために私はそうします。 – Batman

答えて

2

でそれらをしたい場合にはパンダを使用する方がはるかに簡単だが、ここで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) 
+0

私はパンダを使うのが好きですが、残念ながらそれはnumpyにする必要があります。 – Batman

+0

これは純粋ではありません。私はパンダでダミーの日付を作成するだけです。あなたのデータを 'np_dates'で始めるとうまくいくはずです。 –

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]') 
関連する問題