Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Numpy 1.6.1中将float32数组转换为datetime64_Python_Datetime_Numpy - Fatal编程技术网

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

Python 在Numpy 1.6.1中将float32数组转换为datetime64,python,datetime,numpy,Python,Datetime,Numpy,在numpy中将整数日期转换为datetime64的正确方法是什么?我试过: import numpy a = numpy.array([20090913, 20101020, 20110125]) numpy.datetime64(a.astype("S8")) 但是得到一个不正确的转换。使用numpy.loadtxt(它们来自csv文件)将它们正确地读入numpy.datetime64对象中如何?您的问题是datetime64需要格式为yyyy-mm-dd的字符串,而类型转换生成格式为yy

在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:NotImplemented 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[4:6], x[6:]), otypes=['S10'])
>>> conversion(a.astype('S10'))
array(['2009', '2010', '2011'],
      dtype='|S4')
出于某种原因,它忽略了
类型
,并输出
|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
无论有没有破折号都可以正常工作……

奇怪的是,它的工作原理是:
numpy.datetime64(a.astype(“S8”).tolist()
,而它没有:
numpy.datetime64(a.astype(“S8”)
。第一个方法的复杂度仍然比:
numpy.array([numpy.datetime64(str(i))for i in a])
。我问为什么进来。

+1来自我;您的第一个解决方案对我来说似乎很好(NumPy 2.0 dev)。我想知道为什么NumPy.datetime64('20090921')可以工作,如果所需的格式是带破折号的?@Benjamin真的很奇怪。。。但是你的评论给了我一个新的想法,试试我的更新答案,对我来说效果很好。所以基本上,numpy.array([numpy.datetime64(str(i))代表a中的i])。我想知道是否还有比这更直接的方法。@Benjamin:你说的更直接的方法是什么意思?从csv/文本文件中读取数据时直接读取?