我想要传递一个datetime数组给一个Numba函数(它不能被矢量化,否则会非常慢)。我知道Numba支持numpy.datetime64。然而,它似乎支持datetime64D,但不支持datetime64ns (我通过艰苦的方式了解到这一点:它有文档吗?)。
我试图从datetime64ns转换到datetime64D,但似乎找不到一种方法!有什么想法吗?
我已经用下面最少的代码总结了我的问题。如果您运行的是datetime64D的testdf(mydates),它会工作得很好。如果你运行testdf(dates_input),它是datetime64ns,注意这个例子只是把日期传递给Numba函数,这个函数(还没有)对它们做任何事情。我尝试将dates_input转换为datetime64D,但转换不起作用。在我的原始代码中,我从一个SQL表中读取数据到一个pandas数据帧中,并且需要一个将每个日期的日期更改为15日的列。
import numba
import numpy as np
import pandas as pd
import datetime
mydates =np.array(['2010-01-01','2011-01-02']).astype('datetime64[D]')
df=pd.DataFrame()
df["rawdate"]=mydates
df["month_15"] = df["rawdate"].apply(lambda r: datetime.date( r.year, r.month,15 ) )
dates_input = df["month_15"].astype('datetime64[D]')
print dates_input.dtype # Why datetime64[ns] and not datetime64[D] ??
@numba.jit(nopython=True)
def testf(dates):
return 1
print testf(mydates)如果我运行testdf(dates_input),我得到的错误是:
numba.typeinfer.TypingError: Failed at nopython (nopython frontend)
Var 'dates' unified to object: dates := {pyobject}发布于 2015-08-10 19:18:44
Series.astype将所有类似日期的对象转换为datetime64[ns]。要转换为datetime64[D],请先使用values获取NumPy数组,然后再调用astype
dates_input = df["month_15"].values.astype('datetime64[D]')请注意,NDFrames (如Series和DataFrames)只能将类似datetime的对象作为datetime64[ns]数据类型的对象。自动将所有的datetime-like转换为通用的dtype,简化了后续的日期计算。但是它使得在DataFrame列中存储datetime64[s]对象变得不可能。Pandas核心开发人员,Jeff Reback explains,
“我们不允许直接转换,因为在内部保存除datetime64ns之外的任何东西都太复杂了(根本不需要)。”
还要注意的是,即使df['month_15'].astype('datetime64[D]')的数据类型是datetime64[ns]
In [29]: df['month_15'].astype('datetime64[D]').dtype
Out[29]: dtype('<M8[ns]')当您遍历系列中的项时,您得到的是datetime64[ns] Timestamps,而不是pandas s。
In [28]: df['month_15'].astype('datetime64[D]').tolist()
Out[28]: [Timestamp('2010-01-15 00:00:00'), Timestamp('2011-01-15 00:00:00')]因此,目前还不清楚Numba在datetime64[ns]上是否真的有问题,它可能只是在Timestamps上有问题。对不起,我不能检查这个--我没有安装Numba。
但是,它可能对您有用,您可以尝试
testf(df['month_15'].astype('datetime64[D]').values)由于df['month_15'].astype('datetime64[D]').values实际上是datetime64[ns]数据类型NumPy数组
In [31]: df['month_15'].astype('datetime64[D]').values.dtype
Out[31]: dtype('<M8[ns]')如果可以,那么您不必将所有内容都转换为datetime64[D],只需将NumPy数组--而不是Pandas Series --传递给testf。
发布于 2019-12-05 01:25:09
在计算两个日期之间的营业天数时,遇到了相同的错误:
from pandas.tseries.offsets import MonthBegin
import numpy as np
# Calculate the beginning of the month from a given date
df['Month_Begin'] = pd.to_datetime(df['MyDateColumn'])+ MonthBegin(-1)
# Calculate # of Business Days
# Convert dates to string to prevent type error [D]
df['TS_Period_End_Date'] = df['TS_Period_End_Date'].dt.strftime('%Y-%m-%d')
df['Month_Begin'] = df['Month_Begin'].dt.strftime('%Y-%m-%d')
df['Biz_Days'] = np.busday_count(df['Month_Begin'], df['MyDateColumn']) #<-- Error if not converted into strings.我的变通方法是使用".dt.strftime(''%Y-%m-%d')“转换日期。它在我的特殊情况下起作用了。
https://stackoverflow.com/questions/31917964
复制相似问题