Python 带日期时间的麻木
是否可以使用Numba加速以下功能Python 带日期时间的麻木,python,pandas,datetime,numba,Python,Pandas,Datetime,Numba,是否可以使用Numba加速以下功能 @jit(nopython=True) def loanDates(startDate, endDate, freq): startDate=pd.to_datetime(startDate) endDate=pd.to_datetime(endDate) if int(12/freq)==12/freq: FirstDate=pd.to_datetime(dt.datetime(startDate.year,star
@jit(nopython=True)
def loanDates(startDate, endDate, freq):
startDate=pd.to_datetime(startDate)
endDate=pd.to_datetime(endDate)
if int(12/freq)==12/freq:
FirstDate=pd.to_datetime(dt.datetime(startDate.year,startDate.month,1))
ts=pd.date_range(start=FirstDate,end=endDate,freq=str(-int(12/freq))+"MS")
ts=list(ts)
for i in range(len(ts)):
if startDate.day>ts[i].days_in_month:
ts[i]=ts[i]+pd.DateOffset(days=ts[i].days_in_month-1)
else:
ts[i]=ts[i]+pd.DateOffset(days=startDate.day-1)
ts=pd.DatetimeIndex(ts)
我得到了这个错误:
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Untyped global name 'str': cannot determine Numba type of <class 'type'>
File "<ipython-input-58-3eac94417232>", line 16:
def loanDates(startDate, endDate, freq):
<source elided>
ts=pd.date_range(start=FirstDate,end=endDate,freq=str(-int(12/freq))+"MS")
出错
ValueError: Could not convert object to NumPy timedelta
那么,有没有可能使用numba来实现这种功能呢?慢的部分是你的
for
循环,你不需要使用numba来优化它。与此相反:
ts=list(ts)
for i in range(len(ts)):
if startDate.day>ts[i].days_in_month:
ts[i]=ts[i]+pd.DateOffset(days=ts[i].days_in_month-1)
else:
ts[i]=ts[i]+pd.DateOffset(days=startDate.day-1)
将其矢量化,如下所示:
overflow = startDate.day > ts.days_in_month # array of bools
offsets = (ts.days_in_month-1).where(overflow, startDate.day-1)
ts += pd.DateOffset(days=offsets)
或进一步简化:
offsets = np.minimum(ts.days_in_month, startDate.day) - 1
ts += pd.DateOffset(days=offsets)
这应该至少快10倍。这是有道理的,但是pd.DateOffset似乎只接受int/float作为offset变量。我收到以下错误:
TypeError:无效类型。必须是int或float。
所以它需要我使用循环。您使用的是什么版本的Pandas?这对您有用吗:pd.DateOffset(days=pd.Int64Index([1,2,3])
?它肯定在0.23下工作。还可以尝试使用DateOffset(days=offsets.values)
看看这是否有效。第一件事对我有效。但是,DateOffset(days=offsets.values)
不起作用。我使用的是pandas 0.24.2您可能想用以下数据复制它:sd=“2022-12-31 00:00:00”ed=“2019-03-31 00:00:00”fq=12
在这种情况下,ts
是空的,这就是它不起作用的原因。尝试使用非空数据的案例。您可以添加显式检查,如if ts.empty:return
,以处理退化情况。
offsets = np.minimum(ts.days_in_month, startDate.day) - 1
ts += pd.DateOffset(days=offsets)