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

为什么不能将numpy数组从datetime隐式转换为np.datetime64?

万俟沛
2023-03-14
问题内容

说,我有一个datetime

given_time = datetime(2013, 10, 8, 0, 0, 33, 945109,
                      tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, 
                                                             name=None))

我想将其转换为np.datetime64

np.datetime64(given_time)
> numpy.datetime64('2013-10-08T00:00:33.945109+0100')

效果很好。但是,如果我有一个数组given_time

given_times = np.array([given_time]*3) # dtype is object

双方given_times.astype('datetime64')given_times = np.array([given_time] * 3, dtype=np.datetime64)会引发TypeError: Cannot cast datetime.datetime object from metadata [us] to [D] according to the rule 'same_kind'

因此,我必须指定单位:

given_times.astype('datetime64[us]')
# or
given_times = np.array([given_time]*3, dtype='datetime64[us]')

我的问题是,为什么我必须在这里指定单位?它在np.datatime64构造函数中不需要单位。


问题答案:

我知道这是一个古老的问题,但是如果有人遇到这个问题,我会尽力回答。

  1. 从1.11版本开始,numpy不要尝试将date / datetime对象的可迭代变量自动转换为datetime64数组,这从测试套件的摘录中可以很清楚地看出:

    dt = datetime.date(1970, 1, 1)
    arr = np.array([dt])
    assert_equal(arr.dtype, np.dtype(‘O’))

    dt = datetime.datetime(1970, 1, 1, 12, 30, 40)
    arr = np.array([dt])
    assert_equal(arr.dtype, np.dtype(‘O’))

理想情况下,numpy会认为datetime64可以使用正确的单位;看到这个问题。

  1. datetime64从标量构造时,将其设置M8[D]为日期对象和日期时间对象的单位M8[us](相关测试)。

  2. 如果指定dtype='datetime64',或者,同样地,dtype='M8'时,单位设置为“通用”,后来做出决议M8[D](尽管这是合乎逻辑的有它解析为M8[D],看到这个问题):

    np.datetime_data(np.dtype(‘datetime64’))
    (‘generic’, 1)
    np.datetime_data(np.dtype(‘M8’))
    (‘generic’, 1)
    np.datetime_data(np.dtype(‘M8[D]’))
    (‘D’, 1)
    np.datetime_data(np.dtype(‘M8[us]’))
    (‘us’, 1)

  3. given_times.astype('datetime64')不再引发异常-在1.11中已修复。

  4. 从1.11开始,datetime64对象是timezone-naive,因此tzinfo如所提供的示例中那样传递带有set的datetime对象将触发弃用警告。



 类似资料:
  • 问题内容: 您可以将int隐式转换为double: 您可以将int显式转换为double: 您可以将double显式转换为int: 为什么不能将一个double隐式转换为int? : 问题答案: 的范围比宽。这就是为什么您需要显式强制转换。由于相同的原因,您不能隐式地从转换为:

  • 问题内容: 注意: 这要求与通常的元组到数组的转换相反。 我必须将一个参数传递给(包装的c ++)函数作为嵌套元组。例如,以下作品 而以下 不 不幸的是,我想使用的参数是一个numpy数组。对于某些N,该阵列的尺寸始终为2xN,这可能会很大。 有没有简单的方法可以将其转换为元组?我知道我可以循环遍历,创建一个新的元组,但是如果numpy数组提供了一些不错的访问权限,我会更喜欢。 如果不可能如我所愿

  • 问题内容: 我正在尝试将代表黑白图像的2D Numpy数组转换为3通道OpenCV数组(即RGB图像)。 基于代码示例和文档,我正尝试通过Python执行此操作,例如: 但是,对CvtColor()的调用将引发以下cpp级异常: 我究竟做错了什么? 问题答案: 您的代码可以固定如下: 简短说明: 数据类型不受OpenCV的支持(它支持,,,,,,) 无法处理numpy数组,因此必须将两个参数都转换

  • 问题内容: 我想将图像转换为NumPy数组再转换为PySide QPixmap,因此可以显示它(在PySide UI中编辑:)。我已经找到了此工具:qimage2ndarray,但它仅适用于PyQt4。我试图对其进行更改以使其能够与PySide一起使用,但是我将不得不更改该工具的C部分,并且我没有使用C的经验。我该怎么做?或者有其他选择吗? 问题答案: 一种选择是仅使用PIL库。 您可以在http

  • 问题内容: 我有一个WebService返回DateTime字段。 我得到一个结果,但是 我想我怎么能做到这一点。 通过设置Header Content-Type:application / json; charset = utf-8; 我得到了类似的结果。 问题答案: 您可以更改您的WS以返回带有DateTime值的long。要返回的值是自Unix纪元(01/01/1970)以来的毫秒数。这可以

  • 以下代码在C++11中编译成功: 它包括用于现代C++的JSON。一个工作示例在这个Wandbox中。 JSON变量被隐式转换为字符串。但是,如果我取消最后一行的注释,这是一个显式转换,它将无法编译。这里的编译结果。 除了这个json库的特殊细微差别之外,如何编写一个类,使隐式转换工作,而显式转换不工作? 是否有某种构造函数限定符允许这种行为?

  • 问题内容: 我可以隐式地将int转换为long,并将long转换为Long。为什么无法将int隐式转换为Long?为什么Java不能在示例的最后一行进行隐式转换? 问题答案: 和是对象。装箱/拆箱仅适用于原语。做的就像,那不是不!另外,请记住,之间没有继承,所以甚至无效

  • 我的df中有3列 如何将其转换为矩阵?我试过了 但这并没有给出一个矩阵