2012-08-08 26 views
11

Jak uzyskać czas UNIX z numpy.datetime64 lub numpy.datetime_?Jak uzyskać uniksowy znacznik czasu z numpy.datetime64

jak w na przykład:

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

zgodnie z docs datetime64 nie jest naprawdę wiarygodny w [numpy 1.6] (http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#differences-between-1-6-i- 1-7-datetimes). Nawet dla 1,7 api jest eksperymentalne. Więc nie jestem pewien, czy uzyskasz spójne wyniki na różnych platformach i architekturach (64-bitowych?). Więcej informacji znajduje się w dokumencie [pandas 0.8 release notes] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#potential-porting-issues-for-pandas-0-7-3- użytkowników). Więc nie jestem pewien, czy jest to dobry wybór, aby w ogóle korzystać z datetime64 na numpy 1.6. – bmu

+0

Tak, okey, ponieważ kod będzie eksperymentalny sam w sobie i tylko rezyduje na jednej maszynie, można go uznać za działający, jeśli działa poprawnie? – SlimJim

+0

ok, ale powinieneś podać numpy wersję, platformę i architekturę (być może wersję pythona, te same wyniki na 2 i 3?) W twoim pytaniu. w przeciwnym razie może być mylące dla kogoś, kto to czyta. – bmu

Odpowiedz

4

Otrzymuję niespójne wyniki dla wartości np.datetime64('now') dla numpy 1.6.1 vs. 1.7.

Działa to zarówno:

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

Dostaję 1344384000000000, 2 godziny później ;-). Jestem na komputerze 64-bitowym i tz utc + 2. – bmu

+0

w 1.6.1 + Ubuntu, otrzymuję 64-bitowy numer, ale na moim macu z 1.7.0-dev otrzymuję 32-bitową wartość. – jterrace

+0

@bmu zaktualizowana odpowiedź - wydaje się być inna na 1.6.1 vs 1.7 – jterrace

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

wydaje się powrót znacznik czasu UNIX, mam zaznaczone tylko z kilku terminach.

+0

Czy faktycznie to przetestowałeś? Otrzymuję 1344 – jterrace

+0

Otrzymuję 1344384000, 2 godziny później ;-). Jestem na komputerze 64-bitowym i tz utc + 2. – bmu

+0

@jterrace, tak, przetestowałem, używam najnowszego numpy na 64-bitowym Ubuntu testowałem również na 64-bitowej Vista. Dostaję 1344384000 – SlimJim

4

numpy datetime64 ma zmienne jednostki:

ekstrahowane z official doc:

Jednostką pamięci wewnętrznej jest automatycznie wybrany z postaci napisu i może to być jednostka daty lub jednostka czasu. Jednostkami daty są lata ("Y"), miesiące ("M"), tygodnie ("W") i dni ("D"), natomiast jednostki czasu to godziny ("h"), minuty ("m"), sekund ("s"), milisekundy ("ms") i kilka dodatkowych jednostek opartych na przedrostkach SI.

Więc, najpierw musimy sprawdzić bieżącą jednostkę używając dtype, na przykład:

>>> 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' 

i tak dalej ....

2

W celu uwzględnienia jednostek, myślę trzeba zrobić coś takiego:

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

pamiętać, że ta zamienia się w „s” (The [s]) przed konwersja do liczby całkowitej s. Działa to w NumPy 1.12.1.

Powiązane problemy