簡體   English   中英

在Numpy 1.6.1中將float32數組轉換為datetime64

[英]Convert float32 array to datetime64 in Numpy 1.6.1

在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[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在有或沒有短划線的情況下工作正常......

奇怪的是,這有效: numpy.datetime64(a.astype("S8").tolist()) ,而這不是: numpy.datetime64(a.astype("S8")) 第一種方法仍然比以下方法更復雜: numpy.array([numpy.datetime64(str(i)) for i in a]) 我問這個問題為什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM