我想将一个包含datetime 64 [m]和timedelta 64 [m]字段的结构化NumPy数组转换为一个等效的包含自纪元以来的秒数的结构化数组。np.array
中的字段大小对于将非结构化数组转换为结构化数组非常重要。(Convert a numpy array to a structured array)
由于当前的np.datetime64
字段比int
字段长几秒,因为epoch不可能将数组转换到位-对吗?(我更喜欢这个选项。)
简单而错误的做法是:
import numpy as np
import numpy.lib.recfunctions as rf
datetime_t = np.dtype([("start", "datetime64[m]"),
("duration", "timedelta64[m]"),
("score", float)])
seconds_t = np.dtype([("start", "int"),
("duration", "int"),
("score", float)])
unstructured = np.arange(9).reshape((3, 3))
print(unstructured)
datetime_structure = rf.unstructured_to_structured(unstructured, dtype=datetime_t)
print(datetime_structure)
seconds_structure = datetime_structure.astype(seconds_t)
print(seconds_structure.dtype)
输出如下:
[[0 1 2]
[3 4 5]
[6 7 8]]
[('1970-01-01T00:00', 1, 2.) ('1970-01-01T00:03', 4, 5.)
('1970-01-01T00:06', 7, 8.)]
[(0, 1, 2.) (3, 4, 5.) (6, 7, 8.)]
Process finished with exit code 0
因为我指定了分钟,所以应该得到60秒的倍数,而不是一位数。
旁注:我对第一次转换为DateTime格式感到困惑,因为DateTime不是以分钟而是以秒为单位。我指定了datetime64[m]
并将3(以及0和6)转换为该格式,我希望是3分钟(“1970 -01- 01 T03:00”),而不是3秒(“1970 -01- 01 T00:03”)。哦,好吧。也许有人能解释一下?
如何优雅而高效地转换这样的结构化数组?是否需要手动迭代数组(我的真实的数组比这个例子多了几个字段),逐个复制列,然后转换时间字段?假设我想转换包含这些时间格式的多个不同结构,在结构化阵列中转换这些字段的通用方法将是受欢迎的,而无需单独指定字段。
1条答案
按热度按时间wztqucjr1#
这就是我现在的做法,我定义了两种可选的数据类型:
1.一个具有datetime64[s],另一个
1.一个具有int,
先转换为seconds,然后再转换为int,如下所示:
它给出了这个输出: