TimedeltaIndexes代表固定的時間跨度.可以将它們添加到Pandas時間戳中以按固定金額遞增它們.他們的行為決不取決于時間戳是否是營業日.
TimedeltaIndex本身絕不是工作日.
由于最終目标是計算DatetimeIndex和Timestamp之間的天數,是以我會檢視另一個方向,而不是轉換為TimedeltaIndex.
不幸的是,日期計算相當複雜,并且已經湧現出許多資料結構來處理它們 – Python datetime.dates,datetime.datetimes,Pandas Timestamps,NumPy datetime64s.
他們每個人都有自己的優勢,但沒有一個人能夠勝任各種目的.至
利用他們的優勢,有時需要進行轉換
這些類型.
要使用np.busday_count,您需要将DatetimeIndex和Timestamp轉換為
某種類型的np.busday_count可以了解.你稱之為kludginess的是代碼
需要轉換類型.假設我們想要使用np.busday_count,我們無法解決這個問題 – 而且我知道這項工作沒有比np.busday_count更好的工具.
是以,雖然我認為沒有更簡潔的方式來計算工作日
比你提出的方法,有一個更高效的方式:
轉換為datetime64 [D]而不是Python datetime.date對象:
import pandas as pd
import numpy as np
drg = pd.date_range('2000-07-31', '2015-08-05', freq='B')
timestamp = pd.Timestamp('2015-08-05', 'B')
def using_astype(drg, timestamp):
A = drg.values.astype('
B = timestamp.asm8.astype('
return np.busday_count(A, B)
def using_datetimes(drg, timestamp):
A = [d.date() for d in drg]
B = pd.Timestamp('2015-08-05', 'B').date()
return np.busday_count(A, B)
對于上面的例子,這個速度快了100倍(其中len(drg)接近4000):
In [88]: %timeit using_astype(drg, timestamp)
10000 loops, best of 3: 95.4 µs per loop
In [89]: %timeit using_datetimes(drg, timestamp)
100 loops, best of 3: 10.3 ms per loop
無論如何,np.busday_count将其輸入轉換為datetime64 [D],是以避免與datetime.dates之間的這種額外轉換更有效.