2012-08-27 31 views
12

Tôi có một số dữ liệu đầu vào, với dấu thời gian trong tệp đầu vào theo dạng giờ từ ngày được chỉ định trong tên tệp.Làm thế nào tôi có thể tạo một vùng trăn số lượng lớn của datetime

Đây là một chút vô ích, vì vậy tôi cần phải chuyển đổi nó thành các đối tượng datetime.datetime trăn, và sau đó đặt nó vào một mảng numpy. Tôi có thể viết một vòng lặp for, nhưng tôi muốn làm một cái gì đó như:

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

mà ném một TypeError.

Việc này có thể thực hiện được không? Tôi đang mắc kẹt với python 2,6 và gumpy 1.6.1.

+0

Xem thêm http://stackoverflow.com/questions/993358/creating-a-range-of-dates-in-python – nneonneo

Trả lời

8

Xem NumPy Datetimes and Timedeltas. Về cơ bản, bạn có thể biểu diễn thời gian biểu trong NumPy bằng cách sử dụng loại numpy.datetime64, cho phép bạn thực hiện phạm vi giá trị.

Đối với NumPy 1.6, trong đó có một ít nhiều hữu ích datetime64 loại, bạn có thể sử dụng danh sách hiểu biết phù hợp để xây dựng datetimes (xem thêm 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)]) 

này tạo

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

Nếu chỉ có tôi có numpy 1.7, đây sẽ là câu trả lời. Nhưng có vẻ như tôi có 1.6.1, vì vậy ví dụ không hoạt động. – Melanie

+0

Đã thêm phương thức hoạt động với 1.6. – nneonneo

+0

Và cũng tương thích với datetime tôi cần để xuất. Cảm ơn! – Melanie

5

Lưu ý rằng giải pháp @neneo có thể được đơn giản hóa trong

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

nhờ vào các thao tác mảng NumPy. Mảng result sau đó là dtype=object.

Đối với các phạm vi phức tạp hơn, bạn có thể quan tâm đến gói scikits.timeseries (không còn được duy trì) hoặc tốt hơn, gói pandas đã thực hiện lại hầu hết các ý tưởng của scikits.timeseries. Cả hai gói hỗ trợ phiên bản cũ của NumPy (1.5, 1.6 ...)

+0

Cảm ơn - có vẻ như tôi nên sử dụng gấu trúc cho toàn bộ công việc. Lần sau :-) – Melanie

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

Điểm mấu chốt ở đây là sử dụng astype(datetime), nếu không kết quả sẽ là datetime64.

+0

Điều này đẹp hơn nhiều – josh

3

Như đã lưu ý trong câu trả lời khác, đối với Numpy> 1.7, bạn có thể sử dụng khả năng datetime được tích hợp sẵn của Numpy. Các ví dụ trong tài liệu NumPy không bao gồm sử dụng np.arange với các bước, vì vậy đây là một:

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

NumPy đặt dtype của kết quả này để datetime64[h]. Bạn có thể đặt điều này rõ ràng cho một số đơn vị thời gian nhỏ hơn với dtype='datetime64[m]'.

Trong phiên bản 1.8.1 (và tôi mong đợi trước đó), cố gắng thêm một phần bù vào mảng kết quả nhỏ hơn một giờ sẽ không có hiệu lực.

  • timearray += np.timedelta64(10,'s') không thay đổi timearray
  • timearray2 = timearray + np.timedelta64(10,'s') sẽ bổ sung thêm 10 giây để timearray và chuyển đổi dtype của timearray2 để datetime64[s]
3

Với NumPy hiện đại bạn có thể làm điều này:

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

Và nó cung cấp cho bạn:

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]') 
Các vấn đề liên quan