2012-08-27 59 views
12

我有一些輸入數據,輸入文件中的時間戳以文件名中指定的日期時間的小時數形式出現。我如何製作一個python numpy日期時間格式

這是有點沒用,所以我需要將它轉換爲python datetime.datetime對象,然後把它放在一個numpy數組中。我可以寫一個for循環,但我想做類似的事情:

numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1)) 

它引發TypeError。

可以這樣做嗎?我堅持使用python 2.6和numpy 1.6.1。

+0

另請參閱http://stackoverflow.com/questions/993358/creating-a-range-of-dates-in-python – nneonneo

回答

8

請參閱NumPy Datetimes and Timedeltas。基本上,您可以使用numpy.datetime64類型在NumPy中表示日期時間,它允許您執行值的範圍。

對於NumPy的1.6,其中有一個更有效datetime64類型,你可以用一個合適的列表中理解到建立日期時間(見Creating a range of dates in Python):

base = datetime.datetime(2000, 1, 1) 
arr = numpy.array([base + datetime.timedelta(hours=i) for i in xrange(24)]) 

這將產生

array([2000-01-01 00:00:00, 2000-01-01 01:00:00, 2000-01-01 02:00:00, 
    2000-01-01 03:00:00, 2000-01-01 04:00:00, 2000-01-01 05:00:00, 
    2000-01-01 06:00:00, 2000-01-01 07:00:00, 2000-01-01 08:00:00, 
    2000-01-01 09:00:00, 2000-01-01 10:00:00, 2000-01-01 11:00:00, 
    2000-01-01 12:00:00, 2000-01-01 13:00:00, 2000-01-01 14:00:00, 
    2000-01-01 15:00:00, 2000-01-01 16:00:00, 2000-01-01 17:00:00, 
    2000-01-01 18:00:00, 2000-01-01 19:00:00, 2000-01-01 20:00:00, 
    2000-01-01 21:00:00, 2000-01-01 22:00:00, 2000-01-01 23:00:00], dtype=object) 
+0

如果只有我有numpy 1.7,這將是答案。但似乎我有1.6.1,所以這個例子不起作用。 – Melanie

+0

增加了一種適用於1.6的方法。 – nneonneo

+0

而且還與我需要輸出的日期時間兼容。謝謝! – Melanie

5

請注意@nneonneo解決方案可以簡化爲

result = first_date + np.arange(24) * datetime.timedelta(hours=1) 

感謝NumPy數組操作。 result數組然後有dtype=object

對於更復雜的範圍內,你可能會感興趣的scikits.timeseries包(不再維護)或更高時, pandas包重新實現了大部分的scikits.timeseries想法。這兩個包支持舊版本NumPy的(1.5,1.6 ... ...)的

+0

謝謝 - 看起來我應該一直在使用熊貓來完成整個任務。下一次:-) – Melanie

13
t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime) 

這裏的關鍵點是使用astype(datetime),否則結果將是datetime64

+0

這更好 – josh

3

正如在另一個答案中指出的,對於Numpy> 1.7,您可以使用Numpy的內置日期時間功能。在NumPy的文檔中的例子並不包括使用np.arange有步驟,所以這裏是一個:

timearray = np.arange('2000-01-01', '2000-01-02',np.timedelta64(1,'h'), dtype='datetime64')

numpy的設置這一結果datetime64[h]的D型。您可以使用dtype='datetime64[m]'明確將其設置爲一些較小的時間單位。

在版本1.8.1(和我期望的更早)中,嘗試向小於一個小時的結果數組添加偏移量將不起作用。

  • timearray += np.timedelta64(10,'s')不會改變timearray
  • timearray2 = timearray + np.timedelta64(10,'s')將10秒增加timearray和轉換的timearray2datetime64[s]
3

的D型細胞隨着現代NumPy的,你可以這樣做:

np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08')) 

它給你:

array(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', 
     '2017-01-05', '2017-01-06', '2017-01-07'], dtype='datetime64[D]')