2015-04-20 8 views
8

I w zasadzie ten sam problem twarz napisali tutaj: Converting between datetime, Timestamp and datetime64Jak przekonwertować numpy datetime64 do datetime

ale nie mogłem znaleźć zadowalającej odpowiedzi od niego, moje pytanie, jak wydobyć z datetime typu numpy.datetime64:

gdy próbuję:

np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime) 

dała mi: 1339999205453000000L

moje obecne rozwiązanie jest conve rt datetime64 do ciągu znaków, a następnie ponownie do datetime. ale wydaje się to dość głupią metodą.

+1

że 'wartość L' jest taki sam jak w '.tolist()' – hpaulj

+0

Z pliku 'test' znalazłem, że dtype" M8 [ms] "łatwo konwertuje na' datetime'. – hpaulj

+0

Czy masz przeczytać [moja odpowiedź * do końca *] (http://stackoverflow.com/a/13704307/4279)? Czy zauważyłeś, że różne wersje numpy zachowują się tutaj inaczej? Odpowiedź zawiera kod dla różnych wersji 'numpy' (wersje są * jawnie * określone). Istnieje nawet przykład kodu, który tworzy liczbę 'long', a następnie pokazano, jak w tym przypadku uzyskać' datetime'. – jfs

Odpowiedz

9

Pożyczanie od Converting between datetime, Timestamp and datetime64

In [220]: x 
Out[220]: numpy.datetime64('2012-06-17T23:00:05.453000000-0700') 

In [221]: datetime.datetime.utcfromtimestamp(x.tolist()/1e9) 
Out[221]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999) 

Rachunkowość stref czasowych myślę, że ma rację. Wygląda jednak dość niepewnie.

astype('O') is better (I think) than tolist()) `:

In [294]: datetime.datetime.utcfromtimestamp(x.astype('O')/1e9) 
Out[294]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999) 

lub uzyskać datetime w lokalu:

In [295]: datetime.datetime.fromtimestamp(x.astype('O')/1e9) 

Ale w pliku test_datatime.py https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_datetime.py

znajdę jakieś inne opcje - pierwsza przekonwertuj ogólny datetime64 na jeden z formatów określających jednostki:

In [296]: x.astype('M8[D]').astype('O') 
Out[296]: datetime.date(2012, 6, 18) 

In [297]: x.astype('M8[ms]').astype('O') 
Out[297]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000) 

To działa dla tablic:

In [303]: np.array([[x,x],[x,x]],dtype='M8[ms]').astype('O')[0,1] 
Out[303]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000) 
+0

Zobacz [mój komentarz do odpowiedzi @ eumiro (od pożyczonego od)] (http://stackoverflow.com/questions/13703720/converting-between-datetime-timestamp-and-datetime64#comment18832246_13703930). – jfs

+0

Więc 'long' jest wynikiem jednostek będących' [ns] ' – hpaulj

5

Zauważ, że Datownik JEST podklasa datetime.datetime więc [4] ogólnie zadziała

In [4]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400')) 
Out[4]: Timestamp('2012-06-18 06:00:05.453000') 

In [5]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400')).to_pydatetime() 
Out[5]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000) 
+1

Zobacz [@Wes McKinney's odpowiedz] (http://stackoverflow.com/a/13753918/4279) – jfs

+1

Bug opisany Wes został naprawiony dość Jeszcze przedtem – Jeff

+0

Miałem na myśli, że użyłeś odpowiedzi bez atrybucji – jfs

Powiązane problemy