2012-08-08 41 views
11

Làm cách nào để nhận thời gian UNIX từ numpy.datetime64 hoặc numpy.datetime_?Cách lấy dấu thời gian unix từ numpy.datetime64

Như trong ví dụ:

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

theo tài liệu datetime64 không thực sự đáng tin cậy trong [numpy 1.6] (http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#differences-between-1-6-and- 1-7-datetimes). Ngay cả đối với 1,7 api là thử nghiệm. Vì vậy, tôi không chắc chắn, nếu bạn sẽ nhận được kết quả nhất quán trên các nền tảng và kiến ​​trúc khác nhau (64bit?). Một số thông tin khác được cung cấp trong [chú giải phát hành pandas 0.8] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#potential-porting-issues-for-pandas-0-7-3- người dùng). Vì vậy, không chắc chắn, nếu nó là một sự lựa chọn tốt để sử dụng datetime64 trên 1,6 numpy ở tất cả. – bmu

+0

Vâng, vì mã sẽ tự thử nghiệm và chỉ nằm trong một máy, nó có thể được xem là hoạt động nếu nó hoạt động một lần đúng không? – SlimJim

+0

ok, nhưng sau đó bạn nên chỉ định phiên bản, nền tảng và kiến ​​trúc (có thể là phiên bản python, cùng một kết quả trên 2 và 3), trong câu hỏi của bạn. bằng không nó có thể gây hiểu lầm cho ai đó đọc nó. – bmu

Trả lời

4

Tôi nhận được kết quả không phù hợp với giá trị np.datetime64('now') trên số lượng 1,6.1 so với 1,7.

này hoạt động trên cả hai:

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

Tôi nhận được 1344384000000000, 2 giờ sau ;-). Tôi đang dùng máy 64 bit và tz utc + 2. – bmu

+0

trong 1.6.1 + Ubuntu, tôi nhận được số 64 bit, nhưng trên mac của tôi với 1.7.0-dev, tôi nhận được giá trị 32 bit .. – jterrace

+0

@bmu câu trả lời được cập nhật - nó có vẻ khác trên 1.6.1 so với 1.7 – jterrace

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

dường như để trả lại dấu thời gian UNIX, tôi đã chỉ kiểm tra với một vài ngày.

+0

Bạn đã thực sự kiểm tra điều này? Tôi nhận được 1344 – jterrace

+0

Tôi nhận được 1344384000, 2 giờ sau ;-). Tôi đang dùng máy 64 bit và tz utc + 2. – bmu

+0

@ jterrace, vâng tôi đã thử nghiệm, tôi đang chạy bản mới nhất trên Ubuntu 64bit cũng đã thử nghiệm trên 64bit Vista. Tôi nhận được 1344384000 – SlimJim

4

NumPy datetime64 có các đơn vị biến:

Trích từ official doc:

Các đơn vị lưu trữ nội bộ được chọn tự động từ các hình thức của chuỗi và có thể là đơn vị ngày hoặc đơn vị thời gian. Đơn vị ngày là năm ('Y'), tháng ('M'), tuần ('W') và ngày ('D'), trong khi đơn vị thời gian là giờ ('h'), phút ('m'), giây ('s'), mili giây ('ms') và một số đơn vị dựa trên giây bổ sung SI-prefix.

Vì vậy, trước hết chúng ta cần phải kiểm tra các đơn vị hiện nay sử dụng dtype, ví 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' 

và vân vân ....

2

Để vào tài khoản cho các đơn vị, tôi nghĩ bạn cần phải làm điều gì đó như:

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

Lưu ý rằng điều này chuyển thành 'giây' ([s]) trước khi chuyển thành số nguyên S. Điều này hoạt động trên NumPy 1.12.1.

Các vấn đề liên quan