【问题标题】:How to put a datetime value into a numpy array?如何将日期时间值放入 numpy 数组中?
【发布时间】:2013-11-21 01:56:41
【问题描述】:

我正在学习 python,所以请多多包涵。我一直在尝试获取日期时间 变量放入一个numpy数组,但一直无法弄清楚如何。稍后我需要计算每个索引的时间差异,所以我不知道是否应该将 datetime 变量放入数组中,或者将其转换为另一种数据类型。我得到错误:

'NoneType' object does not support item assignment

我的 dtype 变量构造正确吗? This 没有提到日期时间类型。

import numpy as np
from liblas import file

f = file.File(project_file, mode = 'r')
num_points = int(f.__len())
# dtype should be [float, float, float, int, int, datetime]
dt = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('i', 'u2'), ('c', 'u1'), ('time', 'datetime64')]
xyzict = np.empty(shape=(num_points, 6), dtype = dt)

# Load all points into numpy array
counter = 0
for p in f:
    newrow = [p.x, p.y, p.z, p.i, p.c, p.time]
    xyzict[counter] = newrow     
    counter += 1

提前致谢

编辑:我应该注意我计划在继续之前按日期对数组进行排序。

p.time 格式如下:

>>>p.time
datetime.datetime(1971, 6, 26, 19, 37, 12, 713269)
>>>str(p.time)
'1971-06-26 19:37:12.713275'

【问题讨论】:

  • 你能把project_file的前几行发给我们看看吗?可能有更好的方法来解决这个问题,但这取决于日期的格式等。
  • project_file 实际上是一个 LAS 文件。我以为有更好的方法。如果有帮助,我将使用 p.time 编辑我的帖子。
  • 哦,那个编辑有帮助:尝试使用 'datetime64[us]' 作为你的 dtype。
  • 第 14 行给了我错误 TypeError: expected a readable buffer object
  • 哦,为此尝试将newrow 设为元组而不是列表。

标签: arrays python-2.7 numpy python-datetime


【解决方案1】:

我真的不明白您是如何从文件中获取 datetime 对象的,或者 p 是什么意思,但假设您有一个元组列表(不是列表,请参阅我上面的评论) ,您可以一步完成所有设置:

dat = [(.5, .5, .5, 0, 34, datetime.datetime(1971, 6, 26, 19, 37, 12, 713269)),
       (.3, .3, .6, 1, 23, datetime.datetime(1971, 6, 26, 19, 34, 23, 345293))]

dt = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('i', 'u2'), ('c', 'u1'), ('time', 'datetime64[us]')]

datarr = np.array(dat, dt)

然后您可以按名称访问字段:

>>> datarr['time']
array(['1971-06-26T15:37:12.713269-0400', '1971-06-26T15:34:23.345293-0400'], dtype='datetime64[us]')

或按字段排序:

>>> np.sort(datarr, order='time')
array([ (0.3, 0.3, 0.6, 1, 23, datetime.datetime(1971, 6, 26, 19, 34, 23, 345293)),
        (0.5, 0.5, 0.5, 0, 34, datetime.datetime(1971, 6, 26, 19, 37, 12, 713269))], 
  dtype=[('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('i', '<u2'), ('c', 'u1'), ('time', '<M8[us]')])

【讨论】:

  • 如果我将 newrow 设为一个元组,则每个数组索引包含 6 个数据副本。我应该将空数组的形状更改为 shape=(num_points, 1) 吗?
  • 是的,应该可以。实际上使形状(num_points,) 没有那个。结构化数组是 1d。 “列”是“字段”,元素是元组。
  • 感谢您的耐心等待。这完美无缺。如果我可以问,既然您向我展示了如何排序,我将如何遍历数组,获取时间字段值?
  • 正如您在答案中看到的,您可以使用datarr['time'] 获得所有时间。如果您想对所有这些都做某事,请不要遍历它们,只需将其应用于整个数组即可。如果您确实想要迭代,您仍然可以像处理任何列表或数组一样执行for t in datarr['time']: ...
  • 太好了,再次感谢。我发现 np.nditer(xyzict) 做了我想做的事。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2013-11-04
  • 2018-05-20
  • 1970-01-01
  • 2021-11-26
  • 2021-03-01
  • 2023-04-10
相关资源
最近更新 更多