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

标签 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 的字符串,而类型转换生成格式为 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 在有或没有破折号的情况下都能正常工作...

关于python - 在 Numpy 1.6.1 中将 float32 数组转换为 datetime64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9624820/

相关文章:

Java 结果集 - 将 Java 日期与 SQL getDate() 进行比较

javascript - 根据一天中的时间加载不同的链接

c# - Linq To SQL 和 C# 中的总时间间隔

python - Numpy 数组,每行删除一个任意元素

Python 在类中执行函数

python - 如何在Python中将远程位置的文件名转换为字符串?

python - 基于列标题字符串的 pandas DataFrame 列的条件格式

python - 正则表达式查找单词形式的大数字

python - OpenCV:着色失败

python - Numpy 按列按循环对矩阵进行排序