在Numpy 1.6.1中将float32数组转换为datetime64

时间:2012-03-08 20:56:43

标签: python datetime numpy

在numpy中将整数日期转换为datetime64的正确方法是什么?我试过了:

import numpy
a = numpy.array([20090913, 20101020, 20110125])
numpy.datetime64(a.astype("S8"))

但获得的转换不正确。如何使用numpy.loadtxt(它们来自csv文件)正确读取numpy.datetime64对象?

2 个答案:

答案 0 :(得分:5)

您的问题是datetime64需要格式为yyyy-mm-dd的字符串,而类型转换会生成格式为yyyymmdd的字符串。我会建议这样的事情:

conversion = lambda x: "%s-%s-%s" % (x[:4], x[4:6], x[6:])
np_conversion = numpy.frompyfunc(conversion,1,1)
b = np_conversion(a.astype('S10'))
numpy.datetime64(b)

然而它对我不起作用(我有numpy 1.6.1),它失败并显示消息“NotImplementedError:Not implemented for this type”。除非在1.7中实现,否则我只能建议一个纯Python解决方案:

numpy.datetime64(numpy.array([conversion(str(x)) for x in a], dtype="S10"))

...或预处理您的输入,以预期格式提供日期。

编辑:我还可以使用vectorize提供替代解决方案,但我不太清楚它是如何工作的,所以我不知道出了什么问题:< / p>

>>> conversion = vectorize(lambda x: "%s-%s-%s" % (x[:4], x[4:6], x[6:]), otypes=['S10'])
>>> conversion(a.astype('S10'))
array(['2009', '2010', '2011'],
      dtype='|S4')

出于某种原因,它忽略了otypes并输出了|S4而不是|S10。抱歉,我无法提供帮助,但这应该为搜索其他解决方案提供了一个起点。

更新:感谢OP反馈,我想到了一个新的可能性。这应该按预期工作:

>>> conversion = lambda x: numpy.datetime64(str(x))
>>> np_conversion = numpy.frompyfunc(conversion, 1, 1)
>>> np_conversion(a)
array([2009-09-13 00:00:00, 2010-10-20 00:00:00, 2011-01-25 00:00:00], dtype=object)

# Works too:
>>> conversion = lambda x: numpy.datetime64("%s-%s-%s" % (x/10000, x/100%100, x%100))

奇怪的是,在这种情况下,datetime64无论是否有破折号都能正常工作......

答案 1 :(得分:5)

奇怪的是,这有效:numpy.datetime64(a.astype("S8").tolist()),而不是:numpy.datetime64(a.astype("S8"))。第一种方法仍然比numpy.array([numpy.datetime64(str(i)) for i in a])更复杂。我在this question中询问了原因。