如何将numpy结构化数组的某些列转换为不同的时间格式?

wrrgggsh  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(167)

我想将一个包含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”)。哦,好吧。也许有人能解释一下?
如何优雅而高效地转换这样的结构化数组?是否需要手动迭代数组(我的真实的数组比这个例子多了几个字段),逐个复制列,然后转换时间字段?假设我想转换包含这些时间格式的多个不同结构,在结构化阵列中转换这些字段的通用方法将是受欢迎的,而无需单独指定字段。

wztqucjr

wztqucjr1#

这就是我现在的做法,我定义了两种可选的数据类型:
1.一个具有datetime64[s],另一个
1.一个具有int,
先转换为seconds,然后再转换为int,如下所示:

import numpy as np

minutes_dt = np.dtype([("time", "datetime64[m]"),
                      ("duration", "timedelta64[m]")])

seconds_dt = np.dtype([("time", "datetime64[s]"),
                      ("duration", "timedelta64[s]")])

basic_dt = np.dtype([("time", int),
                      ("duration", int)])

minutes = np.array([(10,8)], dtype=minutes_dt)
print(minutes)

seconds = minutes.astype(seconds_dt)
print(seconds)

print(minutes.astype(basic_dt), seconds.astype(basic_dt))

它给出了这个输出:

[('1970-01-01T00:10', 8)]
[('1970-01-01T00:10:00', 480)]
[(10, 8)] [(600, 480)]

相关问题