Python 带日期时间的麻木

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

是否可以使用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,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)