2017-01-01 102 views
2

我有一個NP陣列,例如如下:蟒numpy的 - 轉換時間戳來DATETIME

example = np.array([[Timestamp('2005-03-06 17:00:00'), 1225.75, 1226.25, 1225.0, 1225.5, 
     1668.0], 
     [Timestamp('2005-03-06 17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0, 
     1603.0], 
     [Timestamp('2005-03-06 18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25, 
     590.0]], dtype=object) 

的第一列是一個時間戳類型值。 如何將這些值轉換爲datetime? 我知道這個話題很少有類似的問題,但我無法形成一個清晰的理解,並找出一個乾淨整潔的解決方案基於它們。

我可以將單個值的時間戳與example[0,0].to_datetime()進行轉換,但是如何在所有時間戳上同時執行此操作?非常像example[:,0]. ...

+0

在你的''example'沒有定義Timestamp'。你能澄清嗎? –

+0

我的意思是我想將'Timestamp('2005-03-06 18:00:00')'這樣的值轉換爲諸如'datetime.datetime(2005,3,6,17,0)這樣的值' 。 –

+2

我認爲@ JoeT.Boka問的是「你從哪裏得到'Timestamp'類?」,如果我錯了,請糾正我。 – Dekel

回答

3

如果我定義Timestamp作爲numpy日期時間D型:

In [43]: Timestamp=np.datetime64 

然後我可以複製正粘貼example

In [44]: example = np.array([[Timestamp('2005-03-06 17:00:00'), 1225.75, 1226.25 , 1225.0, 1225.5, 1668.0], 
    ...:  [Timestamp('2005-03-06 17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0,   1603.0], 
    ...:  [Timestamp('2005-03-06 18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], dtype=object) 

請注意,此ar射線dtypeobject

In [45]: example 
Out[45]: 
array([[numpy.datetime64('2005-03-06T17:00:00'), 1225.75, 1226.25, 1225.0,1225.5, 1668.0], 
     [numpy.datetime64('2005-03-06T17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0, 1603.0], 
     [numpy.datetime64('2005-03-06T18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], dtype=object) 

的第一列是:

In [46]: example[:,0] 
Out[46]: 
array([numpy.datetime64('2005-03-06T17:00:00'), 
     numpy.datetime64('2005-03-06T17:30:00'), 
     numpy.datetime64('2005-03-06T18:00:00')], dtype=object) 

可被轉化到datetime64元件的陣列:

In [47]: example[:,0].astype(np.datetime64) 
Out[47]: array(['2005-03-06T17:00:00', '2005-03-06T17:30:00', '2005-03-06T18:00:00'], dtype='datetime64[s]') 

tolist對於這種類型的陣列的轉換元件到datetime對象:

In [48]: example[:,0].astype(np.datetime64).tolist() 
Out[48]: 
[datetime.datetime(2005, 3, 6, 17, 0), 
datetime.datetime(2005, 3, 6, 17, 30), 
datetime.datetime(2005, 3, 6, 18, 0)] 

另外,掠的pandas.Timestamp功能

In [50]: Timestamp = pd.Timestamp 

In [52]: example 
Out[52]: 
array([[Timestamp('2005-03-06 17:00:00'), 1225.75, 1226.25, 1225.0, 1225.5, 1668.0], 
     [Timestamp('2005-03-06 17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0, 1603.0], 
     [Timestamp('2005-03-06 18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], dtype=object) 

In [64]: ts = example[:,0] 
In [65]: ts 
Out[65]: 
array([Timestamp('2005-03-06 17:00:00'), Timestamp('2005-03-06 17:30:00'), Timestamp('2005-03-06 18:00:00')], dtype=object) 

時間戳的迭代轉換對象

In [67]: np.array([t.to_datetime() for t in ts]) 
Out[67]: 
array([datetime.datetime(2005, 3, 6, 17, 0), 
     datetime.datetime(2005, 3, 6, 17, 30), 
     datetime.datetime(2005, 3, 6, 18, 0)], dtype=object) 

但我發現,astype作品與Timestamp對象:

In [73]: ts = example[:,0] 
In [74]: ts.astype('datetime64[s]') 
Out[74]: array(['2005-03-06T17:00:00', '2005-03-06T17:30:00', '2005-03-06T18:00:00'], dtype='datetime64[s]') 

,所以我可以使用tolist做轉換在一個行:

In [75]: ts.astype('datetime64[s]').tolist() 
Out[75]: 
[datetime.datetime(2005, 3, 6, 17, 0), 
datetime.datetime(2005, 3, 6, 17, 30), 
datetime.datetime(2005, 3, 6, 18, 0)] 

我不會形容這是一個最終的解決方案,但它給你的使用日期如何numpy交易的想法。

對於數組數學,我會堅持使用datetime64 dtype。要保留在一個陣列中以及浮點數example[:,1:]必須使用結構化數組。

=================

與副本進行實驗:

In [80]: ex1 = example.copy() 

In [82]: ex1[:,0] = example[:,0].astype('datetime64[s]').tolist() 
In [83]: ex1 
Out[83]: 
array([[datetime.datetime(2005, 3, 6, 17, 0), 1225.75, 1226.25, 1225.0, 1225.5, 1668.0], 
     [datetime.datetime(2005, 3, 6, 17, 30), 1225.75, 1227.5, 1225.75, 1227.0, 1603.0], 
     [datetime.datetime(2005, 3, 6, 18, 0), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], 
     dtype=object) 
+0

嗨thx,這是非常有用的和解釋性的。你會有一個提示,以便在原始數組中將時間戳轉換爲datetime *按照您的示例,我剩下一個數組只包含時間戳我知道我的建議,但最終目標當然是擁有這個簡單的時間序列(即原始「示例」),其時間戳已經轉換了,我必須這樣做的原因是matplotlib plot。 –

+0

Looks就像我可以複製這些'tolist()'結果一樣回到原始數組中。由於'dtype'是對象,它不關心元素是否改變類型。 – hpaulj

1

直升機,嘗試:

example[:,0]= map(lambda x: x.to_datetime(), example[:,0]) 
+0

我喜歡這種語法,因爲'to_datetime'使得它非常清楚發生了什麼。但是,在使用你的線時,變量示例中包含以下內容:'array([[<地圖對象在0x7ff675634940>,1207.5,1209.75,1207.25,1209.0, 7659.0],'你可以看到有一個''地圖對象''應該有一個'datetime.datetime'對不起,我還不熟悉熊貓等等。但是我錯過了什麼嗎? –

+0

哦,我看到你在使用python 3嗎?嘗試在map之前添加一個列表:'list (map(...))' – plumSemPy