Jak przekonwertować numpy.datetime64
obiekt na datetime.datetime
(lub Timestamp
)?
W poniższym kodzie tworzę obiekty datetime, timestamp i datetime64.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
Uwaga: łatwo jest uzyskać datę i godzinę ze znacznika czasu:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Ale jak wyodrębnić datetime
lub Timestamp
z numpy.datetime64
( dt64
)?
.
Aktualizacja: nieco nieprzyjemny przykład w moim zbiorze danych (być może motywujący) wydaje się:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
który powinien być datetime.datetime(2002, 6, 28, 1, 0)
, a nie długi (!) ( 1025222400000000000L
) ...
numpy
,pandas
wersjach.pd.Timestamp(dt64).to_datetime()
. Nadal jestem trochę niezadowolony z tego, ale z pewnością Wes jest mniej specyficzny dla mojego starego problemu (i tak lepiej dla świata)! Jeszcze raz dziękuję za poświęcenie czasu na odpowiedź. :)Timestamp
” iTimestamp
jestdatetime
(podklasą) w każdym razie :)Odpowiedzi:
Aby przekonwertować
numpy.datetime64
na obiekt datetime reprezentujący czas w UTCnumpy-1.8
:Powyższy przykład zakłada, że naiwny obiekt typu data-
np.datetime64
godzina jest interpretowany jako czas w UTC.Aby przekonwertować datetime na np.datetime64 i back (
numpy-1.6
):Działa zarówno na pojedynczym obiekcie np.datetime64, jak i tablicy numpy np.datetime64.
Pomyśl o np.datetime64 w taki sam sposób, jak o np.int8, np.int16 itp. I zastosuj te same metody do konwersji między obiektami Python, takimi jak int, datetime i odpowiadające im obiekty numpy.
Twój „nieprzyjemny przykład” działa poprawnie:
Mogę odtworzyć
long
wartość ponumpy-1.8.0
zainstalowaniu jako:Ten sam przykład:
Zwraca,
long
ponieważ dlanumpy.datetime64
typu.astype(datetime)
jest równoważne z.astype(object)
tą, która zwraca liczbę całkowitą Python (long
) nanumpy-1.8
.Aby uzyskać obiekt datetime, możesz:
Aby uzyskać datetime64, który używa sekund bezpośrednio:
Dokumenty numpy mówią, że interfejs API datetime jest eksperymentalny i może ulec zmianie w przyszłych wersjach numpy.
źródło
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
Co daje długi (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
type(dt64)
jestnumpy.datetime64
idt64.astype(datetime)
jest taki sam długi int ...: snumpy.__version__
->'1.6.1'
Możesz po prostu użyć konstruktora pd.Timestamp. Poniższy schemat może być przydatny w przypadku tego i powiązanych pytań.
źródło
pd.to_datetime
konwertuje wszystko napd.Timestamp
.pd.Timestamp
Obiekt ma sposobuto_pydatetime
, aby powrócić dodatetime.datetime
obiektu orazto_datetime64
sposobu przekształcenia sięnp.datetime64
.Witaj w piekle.
Możesz po prostu przekazać obiekt datetime64 do
pandas.Timestamp
:Zauważyłem, że to nie działa poprawnie w NumPy 1.6.1:
Ponadto,
pandas.to_datetime
może być stosowany (ta jest wyłączona w wersji dev, nie sprawdził v0.9.1):źródło
issubclass(pd.Timestamp, datetime)
jestTrue
. ATimestamp
sama klasa mato_datetime()
metodę.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
zwracaTimestamp('2012-05-01 00:00:00')
przynajmniej w pandach0.17.1
.Myślę, że może być bardziej skonsolidowany wysiłek w odpowiedzi, aby lepiej wyjaśnić związek między modułem datetime Pythona, datetime64 / timedelta64 numpy a obiektami Timestamp / Timedelta pand.
Standardowa biblioteka języka Python dla datetime
Standardowa biblioteka datetime ma cztery główne obiekty
Utwórz te cztery obiekty
Obiekty datetime64 i timedelta64 NumPy
NumPy nie ma osobnych obiektów daty i godziny, tylko jeden obiekt datetime64 reprezentujący pojedynczy moment w czasie. Obiekt datetime modułu datetime ma mikrosekundową precyzję (jedna milionowa sekundy). Obiekt Datetime64 obiektu NumPy pozwala ustawić precyzję od godzin aż do attosekund (10 ^ -18). Konstruktor jest bardziej elastyczny i może przyjmować różne dane wejściowe.
Konstruuj obiekty Datetime64 i timedelta64 NumPy
Podaj liczbę całkowitą z ciągiem znaków dla jednostek. Zobacz wszystkie jednostki tutaj . Konwertuje się na tak wiele jednostek po epoce UNIX: 1 stycznia 1970 r
Możesz także używać ciągów, o ile są one w formacie ISO 8601.
Timedeltas mają jedną jednostkę
Można je również utworzyć, odejmując dwa obiekty datetime64
Pandas Timestamp i Timedelta budują znacznie więcej funkcji na NumPy
Znacznik czasu pandy jest momentem bardzo podobnym do daty i godziny, ale z dużo większą funkcjonalnością. Można skonstruować je albo
pd.Timestamp
albopd.to_datetime
.pd.to_datetime
działa bardzo podobnie (z kilkoma dodatkowymi opcjami) i może konwertować listę ciągów znaków na znaczniki czasu.Konwertowanie datetime Pythona na datetime64 i znacznik czasu
Konwertowanie numpy datetime64 na datetime i Datownik
Konwertuj na znacznik czasu
Konwertuj z datownika na datetime i datetime64
Jest to dość łatwe, ponieważ znaczniki czasu pand są bardzo potężne
źródło
Dla
DatetimeIndex
tego,tolist
zwraca listędatetime
obiektów. Dla pojedynczegodatetime64
obiektu zwraca pojedynczydatetime
obiekt.źródło
.item()
która jest znacznie bardziej wyraźna (i nikt nie może podejść i zacząć argumentować, że powinna zwrócić listę).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
Co daje długi (1025222400000000000L
) (!).item()
(sugerowane przez @seberg),.tolist()
zależy od jednostki datetime64 używa, na przykład,D
produkujedatetime.date()
,us
(mikrosekundy) wytwarzajądatetime.datetime()
,ns
(nanosekundy) wytwarzająlong
. Jednostki zmieniają się w zależności od wartości wejściowych, np.numpy.datetime64('2012-05-01')
Zastosowań'D'
,numpy.datetime64('2012-05-01T00:00:00.000')
zastosowańms
,numpy.datetime64('2012-05-01T00:00:00.000000000')
zastosowańns
. Możesz otworzyć problem, jeśli uznasz go za mylący.Jeśli chcesz przekonwertować całą serię danych pandas na zwykłe dane python, możesz również użyć
.to_pydatetime()
.Obsługuje także strefy czasowe:
UWAGA : Jeśli korzystasz z serii Pandas, nie możesz dzwonić
to_pydatetime()
z całej serii. Będziesz musiał wywoływać.to_pydatetime()
każdy indywidualny datetime64 przy użyciu listy lub czegoś podobnego:źródło
Jedną z opcji jest użycie
str
, a następnieto_datetime
(lub podobne):Uwaga: nie jest równy,
dt
ponieważ stał się „świadomy przesunięcia” :To wydaje się nieeleganckie.
.
Aktualizacja: poradzi sobie z „przykrym przykładem”:
źródło
Ten post jest aktywny od 4 lat i nadal mam problem z tym problemem konwersji - więc problem jest nadal aktywny w 2017 roku. Byłem nieco zszokowany, że dokumentacja numpy nie oferuje prostego algorytmu konwersji, ale to już inna historia.
Natknąłem się na inny sposób wykonania konwersji, który obejmuje tylko moduły
numpy
idatetime
nie wymaga importowania pand, co wydaje mi się dużym kodem do zaimportowania w przypadku tak prostej konwersji. Zauważyłem, żedatetime64.astype(datetime.datetime)
zwrócidatetime.datetime
obiekt, jeśli oryginałdatetime64
jest w jednostkach mikrosekund, podczas gdy inne jednostki zwracają znacznik czasu liczby całkowitej. Używam modułuxarray
do danych I / O z plików Netcdf, który wykorzystuje jednostkidatetime64
w nanosekundach, co powoduje niepowodzenie konwersji, chyba że najpierw przekonwertujesz na jednostki mikro-sekundowe. Oto przykładowy kod konwersji,Został przetestowany tylko na mojej maszynie, którą jest Python 3.6 z najnowszą dystrybucją Anaconda 2017. Patrzyłem tylko na konwersję skalarną i nie sprawdziłem konwersji opartych na macierzy, choć sądzę, że będzie dobrze. Nie szukałem też kodu źródłowego numpy datetime64, aby sprawdzić, czy operacja ma sens, czy nie.
źródło
Wróciłem do tej odpowiedzi więcej razy, niż potrafię zliczyć, więc postanowiłem zebrać małą szybką klasę, która konwertuje
datetime64
wartość Numpy na wartość Pythonadatetime
. Mam nadzieję, że to pomaga innym.Zatrzymam to w torbie z narzędziami, coś mi mówi, że będę jej potrzebować ponownie.
źródło
ts.to_pydatetime()
użyj tej funkcji, aby uzyskać natywny obiekt datetime python
źródło
replace() got an unexpected keyword argument 'tzinfo'
Niektóre rozwiązania działają dla mnie dobrze, ale numpy spowoduje utratę niektórych parametrów. Rozwiązaniem, które działa dla mnie lepiej, jest odczytanie daty jako daty i godziny pandy i wyraźne wycięcie roku, miesiąca i dnia obiektu pandy. Poniższy kod działa w najczęstszej sytuacji.
źródło
w rzeczywistości wszystkie te typy dat mogą być trudne i potencjalnie problematyczne (muszą uważnie śledzić informacje o strefie czasowej). oto co zrobiłem, choć przyznaję, że martwię się, że przynajmniej część tego jest „nie z założenia”. można to również uczynić nieco bardziej kompaktowym w razie potrzeby. zaczynając od numpy.datetime64 dt_a:
numpy.datetime64 („2015-04-24T23: 11: 26.270000-0700”)
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... i oczywiście można je skompresować w jedną linię w razie potrzeby.
źródło
edit
zachować zgodność z: formatowaniem kodu, formatowaniem cytatów i formatowaniem tekstu. Należy również stosować się do wielkich liter, gramatyki i sprawdzać literówki, zgodnie z wytycznymi SO - patrz: Jak