2012-08-08 150 views
11

如何從numpy.datetime64或numpy.datetime_獲取UNIX時間?如何從numpy.datetime64獲取unix時間戳

正如例如:

np.datetime_('2012-08-08 13:37:00') 
+1

根據文檔datetime64在[numpy 1.6]中不是很可靠(http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#differences-between-1-6-and- 1-7-日期時間)。即使是1.7,api也是實驗性的。所以我不確定,如果你會在不同的平臺和體系結構(64位?)上獲得一致的結果。有關更多信息,請參閱[pandas 0.8發行說明](http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#potential-porting-issues-for-pandas-0-7-3-用戶)。所以不確定,如果在numpy 1.6上使用datetime64是個不錯的選擇。 – bmu 2012-08-08 16:49:43

+0

是啊,因爲代碼本身將是實驗性的,只能駐留在一臺機器上,如果它一次正常工作,它可以被認爲是可行的? – SlimJim 2012-08-08 21:22:50

+0

好的,但你應該在你的問題中指定numpy的版本,平臺和體系結構(也許是Python版本,2和3的結果相同?)。否則可能會導致讀者誤解。 – bmu 2012-08-09 08:47:22

回答

4

對於numpy 1.6.1與1.7,我得到np.datetime64('now')的值的結果不一致。

這適用於以下兩者:

>>> import datetime 
>>> import numpy as np 
>>> now = np.datetime64(datetime.datetime.now()) 
>>> (now.astype('uint64')/1e6).astype('uint32') 
1344447810 
+1

我得到1344384000000000,2小時後;-)。我在64位機器上,並且tz utc + 2。在1.6中的 – bmu 2012-08-08 16:36:15

+0

。1 + Ubuntu,我得到了64位的數字,但在我的1.7.0-dev的mac上,我得到了32位的值。 – jterrace 2012-08-08 21:34:50

+0

@bmu更新了答案 - 它在1.6.1和1.7 – jterrace 2012-08-08 21:43:11

0
def get_unixtime(time):  
    return (time.astype(np.int64)/1e6).astype(np.int64) 
get_unixtime(np.datetime64('now')) 

似乎回到了UNIX時間戳,我只用了幾個日期檢查。

+0

你真的測試過了嗎?我得到1344 – jterrace 2012-08-08 15:09:35

+0

2小時後我得到了1344384000 ;-)。我在64位機器上,並且tz utc + 2。 – bmu 2012-08-08 16:35:39

+0

@jterrace,是的,我測試過,我在64位Ubuntu上運行最新的numpy,也在64位Vista上測試過它。我得到1344384000 – SlimJim 2012-08-08 21:17:27

4

numpy的datetime64具有可變的單元:

official doc提取:

用於內部存儲的單元自動地從所述串的形式選擇,並且可以是日期單位或時間單位。日期單位是年('Y'),月('M'),星期('W')和日期('D'),而時間單位是小時('h'),分鐘('m' ),秒('s'),毫秒('ms')和一些額外的SI前綴以秒爲單位。

所以,首先我們需要使用D型檢查當前的單位,例如:

>>> now = np.datetime64(datetime.datetime.now()) 
>>> now.dtype 

# for ns unit, use: 
dtype('<M8[ns]') 
now.astype('int64')/1e9, dtype='int32' 

# for us unit, use: 
dtype('<M8[us]') 
now.astype('int64')/1e6, dtype='int32' 

# for ms unit, use: 
dtype('<M8[ms]') 
now.astype('int64')/1e3, dtype='int32' 

等等....

2

爲了佔單位,我想你需要做的是這樣的:

def get_unixtime(dt64): 
    return dt64.astype('datetime64[s]').astype('int') 

注意,將其轉換爲「秒」(在[s])轉換成整數之前秒。這適用於NumPy 1.12.1。