当前位置: 首页 > 面试题库 >

Python numpy:无法将datetime64 [ns]转换为datetime64 [D](与Numba一起使用)

狄易安
2023-03-14
问题内容

我想将datetime数组传递给Numba函数(无法向量化,否则会很慢)。我了解Numba支持numpy.datetime64。但是,它似乎支持datetime64
[D](日期精度),但不支持datetime64 [ns](毫秒精度)(我很难学到:是否已记录?)。

我试图将datetime64 [ns]转换为datetime64 [D],但似乎找不到方法!有任何想法吗?

我用下面的最少代码总结了我的问题。如果您运行的testdf(mydates)是datetime64
[D],则可以正常运行。如果运行testdf(dates_input)datetime64
[ns],则不会。请注意,此示例只是将日期传递给Numba函数,该函数尚未执行任何操作。我尝试将dates_input转换为datetime64
[D],但是转换不起作用。在我的原始代码中,我从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}

问题答案:

Series.astype将所有类似日期的对象转换为datetime64[ns]。要转换为datetime64[D],请values调用之前使用获取NumPy数组astype

dates_input = df["month_15"].values.astype('datetime64[D]')

请注意,NDFrames(例如Series和DataFrames)只能将类似日期时间的对象保存为dtype对象datetime64[ns]。将所有日期时间喜欢项自动转换为通用dtype可以简化后续日期计算。但是,这使得不可能datetime64[s]在DataFrame列中存储
对象。熊猫的核心开发人员Jeff
Reback解释说,

“我们不允许直接转换,因为它太复杂了,无法在内部保留除datetime64 [ns]以外的任何东西(根本没有必要)。”

另请注意,即使df['month_15'].astype('datetime64[D]')具有dtype datetime64[ns]

In [29]: df['month_15'].astype('datetime64[D]').dtype
Out[29]: dtype('<M8[ns]')

当您遍历系列中的项目时,会得到pandasTimestamps而不是datetime64[ns]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确实是dtype的NumPy数组datetime64[ns]

In [31]: df['month_15'].astype('datetime64[D]').values.dtype
Out[31]: dtype('<M8[ns]')

如果可行,那么您不必将所有内容都转换为datetime64[D],只需要将NumPy数组(而不是Pandas Series)传递给testf



 类似资料:
  • 问题内容: 如何将对象转换为(或Timestamp)? 在下面的代码中,我创建了一个和对象。 注意:很容易从时间戳获取日期时间: 但是我们如何从()中提取datetime或?Timestampnumpy.datetime64dt64 。 更新:我的数据集中的一个令人讨厌的例子(也许是激励性的例子)似乎是: 应该是,而不是长(!)()… 问题答案: 要将日期时间对象转换为代表UTC时间的日期时间对象

  • 问题内容: 有一个Pandas DataFrame: 我想绘制A和B系列vs日期。 然后我要在A系列和B系列之间的区域上应用fill_between(): 哪个输出: matplotlib是否在函数中接受pandas datetime64对象?我应该将其转换为其他日期类型吗? 问题答案: 大熊猫寄存器的转换器中,其可将数字转换的日期时间的类型(如大熊猫DatetimeIndex,和D型的numpy

  • 我目前正在将IntelliJ IDE用于复杂的GWT项目。我想在GWT的开发模式中利用JRebel,所以最近我为IntelliJ安装了JRebel插件,但在使其工作时遇到了麻烦。 基本上IntelliJ不具备在更改时自动编译应用程序的能力,所以每当您对代码进行更改时,我都必须进行编译- 信息:使用JavaC1.7.0_21编译java源代码信息:15个错误信息:0个警告信息:编译完成,9分钟5秒内

  • 我最近安装了Xcode8测试版5。在我的MAC 10.11.6上的Appium 1.6.0测试版现在,在阅读了所有的论坛并使Appium启动并启动我的应用程序后,我无法找到如何用这个Appium 1.6.0测试版启动我的inspector和在我的应用程序中找到元素。如何使用appium 1.6.0测试版启动inspector?如果不能,我们如何找到xpath或找到元素??

  • IntelliJ IDEA 2018.2.3(终极版) 楼#IU-182.4323.46,建于2018年9月3日 jre:1.8.0_152-release-1248-b8 amd64 JVM:OpenJDK 64位服务器VM by JetBrains s.r.o Windows 10 10.0 插件:VisualVM启动器(1.10.138.2210) 当我单击Run选项卡中的launcher图

  • 我们将Java版本从8升级到11,但我在使用Lombok的Getter和Setter注释实现POJO类时遇到了Getter/Setter方法的编译错误。 有没有一种方法可以使用Lombok的注释,该注释提供getter和setter而不在Java11中实现它们? 找不到getStoreName() 其中被声明为类中的全局变量,并在类上方使用@data Lombok注释。