2012-03-08 64 views
8

什么是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文件)?

回答

5

奇怪的是,这个工程:numpy.datetime64(a.astype("S8").tolist()),虽然这并不:numpy.datetime64(a.astype("S8"))。第一种方法比起numpy.array([numpy.datetime64(str(i)) for i in a])还有点复杂。我问为什么在this question

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:对于这种类型的未实现”。除非是在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工作正常使用或不使用破折号...

+0

+1 from me;你的第一个解决方案似乎对我来说很好(NumPy 2.0 dev)。 – doug 2012-03-09 09:58:00

+0

我想知道为什么numpy.datetime64('20090921')的作品,如果所需的格式是破折号? – Benjamin 2012-03-09 13:55:37

+0

@Benjamin真的很奇怪......但是你的评论给了我一个新的想法,尝试我更新的答案,为我工作得很好。 – mgibsonbr 2012-03-09 14:19:33