什么是numpy的转换整数日期datetime64的正确方法?我尝试过:转换FLOAT32阵列datetime64在与NumPy 1.6.1
import numpy
a = numpy.array([20090913, 20101020, 20110125])
numpy.datetime64(a.astype("S8"))
但得到不正确的转换。如何使用numpy.loadtxt正确读取它们作为numpy.datetime64对象(它们来自csv文件)?
什么是numpy的转换整数日期datetime64的正确方法?我尝试过:转换FLOAT32阵列datetime64在与NumPy 1.6.1
import numpy
a = numpy.array([20090913, 20101020, 20110125])
numpy.datetime64(a.astype("S8"))
但得到不正确的转换。如何使用numpy.loadtxt正确读取它们作为numpy.datetime64对象(它们来自csv文件)?
奇怪的是,这个工程:numpy.datetime64(a.astype("S8").tolist())
,虽然这并不:numpy.datetime64(a.astype("S8"))
。第一种方法比起numpy.array([numpy.datetime64(str(i)) for i in a])
还有点复杂。我问为什么在this question。
您的问题是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:对于这种类型的未实现”。除非是在1.7实现的,我只能提出一个纯Python的解决方案:
numpy.datetime64(numpy.array([conversion(str(x)) for x in a], dtype="S10"))
...或预先处理您的输入,交付日期预期的格式。
编辑:我还可以提供另一种解决方案,使用vectorize
,但我不很清楚它是如何工作的,所以我不知道发生了什么错误:
>>> 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 from me;你的第一个解决方案似乎对我来说很好(NumPy 2.0 dev)。 – doug 2012-03-09 09:58:00
我想知道为什么numpy.datetime64('20090921')的作品,如果所需的格式是破折号? – Benjamin 2012-03-09 13:55:37
@Benjamin真的很奇怪......但是你的评论给了我一个新的想法,尝试我更新的答案,为我工作得很好。 – mgibsonbr 2012-03-09 14:19:33