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')
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')
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
Dostaję 1344384000000000, 2 godziny później ;-). Jestem na komputerze 64-bitowym i tz utc + 2. – bmu
w 1.6.1 + Ubuntu, otrzymuję 64-bitowy numer, ale na moim macu z 1.7.0-dev otrzymuję 32-bitową wartość. – jterrace
@bmu zaktualizowana odpowiedź - wydaje się być inna na 1.6.1 vs 1.7 – jterrace
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.
Czy faktycznie to przetestowałeś? Otrzymuję 1344 – jterrace
Otrzymuję 1344384000, 2 godziny później ;-). Jestem na komputerze 64-bitowym i tz utc + 2. – bmu
@jterrace, tak, przetestowałem, używam najnowszego numpy na 64-bitowym Ubuntu testowałem również na 64-bitowej Vista. Dostaję 1344384000 – SlimJim
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 ....
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.
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
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
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