在numpy中将整数日期转换为datetime64的正确方法是什么?我试过了:
import numpy a = numpy.array([20090913,20101020,20110125]) numpy.datetime64(a.astype("S8"))
但得到的转换不正确.如何使用numpy.loadtxt(它们来自csv文件)正确读取numpy.datetime64对象?
解决方法
您的问题是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提供替代解决方案,但我不太清楚它是如何工作的,所以我不知道出了什么问题:
>>> conversion = vectorize(lambda x: "%s-%s-%s" % (x[:4],x[6:]),otypes=['S10']) >>> conversion(a.astype('S10')) array(['2009','2010','2011'],dtype='|S4')
由于某种原因,它忽略了otype并输出| S4而不是| S10.对不起,我无能为力,但这应该为搜索其他解决方案提供一个起点.
更新:感谢OP的反馈,我想到了一个新的可能性.这应该按预期工作:
>>> conversion = lambda x: numpy.datetime64(str(x)) >>> np_conversion = numpy.frompyfunc(conversion,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在有或没有破折号的情况下工作正常……