NumPy结构化数组与日期时间

3
我尝试使用日期时间列构建一个结构化数组。
import numpy as np
na_trades = np.zeros(2, dtype = 'datetime64,i4')
na_trades[0] = (np.datetime64('1970-01-01 00:00:00'),0)

TypeError: Cannot cast NumPy timedelta64 scalar from metadata [s] to  according to the rule 'same_kind'

有没有方法可以解决这个问题?
2个回答

4

在创建数组时,您必须指定datetime64以秒为单位,因为您解析并尝试分配的是datetime64[s]

na_trades = np.zeros(2, dtype='datetime64[s],i4')
na_trades[0] = (np.datetime64('1971-01-01 00:00:00'), 0)

你得到的错误意味着你指定的datetime64对象与你尝试分配的对象不是same_kind。你尝试分配一个秒分辨率的对象,而在构造数组时创建了一个不同的对象(默认情况下,我认为它是纳秒)。

你使用的NumPy版本是什么?对我来说,它与NumPy 1.7.1完美地配合。 - Viktor Kerkez
在1.6.2版本中,它会引发ValueError错误。但在1.7.1版本中,它能够完美运行。非常抱歉。 - falsetru

2
尝试以下方法:
>>> na_trades = np.zeros(2, dtype=[('dt', 'datetime64[s]'), ('vol', 'i4')])
>>> na_trades
array([(datetime.datetime(1970, 1, 1, 0, 0), 0),
       (datetime.datetime(1970, 1, 1, 0, 0), 0)], 
      dtype=[('dt', ('<M8[s]', {})), ('vol', '<i4')])
>>> na_trades[0] = (np.datetime64('1970-01-02 00:00:00'),1)
>>> na_trades
array([(datetime.datetime(4707, 11, 29, 0, 0), 1),
       (datetime.datetime(1970, 1, 1, 0, 0), 0)], 
      dtype=[('dt', ('<M8[s]', {})), ('vol', '<i4')])

实际上,在1.7.1版本中,您的代码会引发异常TypeError: Cannot cast NumPy timedelta64 scalar from metadata [s] to according to the rule 'same_kind'。您应该升级到新版本,因为在NumPy 1.7.x版本中,旧的日期时间管理方式已经过时文档 - Viktor Kerkez
@ViktorKerkez,我更新了代码并确认它可以在1.7.1上运行。感谢您的评论。 - falsetru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接