天天看點

python timestamp 時間區間_python – Pandas DatetimeIndex和Timestamp之間的工作日數

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之間的這種額外轉換更有效.