2016-12-15 3 views
2

betrachten Array unterUmwandlung von 'to_julian_date()' bis 'np.datetime64'

dt = DatetimeIndex(['2016-01-01', '2016-01-01', '2016-01-21', '2016-01-21'], dtype='datetime64[ns]', name=u'date', freq=None) 

i wandeln die oben to_julian_date() dtype

j = dt.to_julian_date() 
Float64Index([2457388.5, 2457388.5, 2457408.5, 2457408.5], dtype='float64') 

wie kann ich j zurück zu dt

konvertieren

Ich versuchte

dt = pd.to_datetime(j, errors = 'coerce') 

wandelt j zurück in Datetime-Objekt, aber die Werte sind nicht das gleiche, hier ist der Ausgang

DatetimeIndex(['1970-01-01 00:00:00.002457388', 
      '1970-01-01 00:00:00.002457388', 
      '1970-01-01 00:00:00.002457408', 
      '1970-01-01 00:00:00.002457408'], 
      dtype='datetime64[ns]', freq=None) 

Antwort

4

Julian dates sind Anzahl der Tage von vor langer Zeit. Eine Zeit vor der Pandas Timestamp-Epoche. Wir beziehen uns auf den Anfang, wenn ein System der Verfolgungszeit die Verfolgungszeit beginnt. Für Timestamp ist das "1970-01-01". Was ich mache, ist die Timestamp Epoche mit pd.to_datetime(0, unit='s'). Das ist das erste mögliche pandas.Timestamp. Dann weise ich die Anzahl der Tage dieses Timestamp vom Anfang des Julianischen Datums an, indem ich to_julian_date() auf diesem Timestamp laufen lasse. Jetzt, da ich die Anzahl der Tage vom Anfang des Julianischen Startdatums bis zur Timestamp Epoche habe, subtrahiere ich das von jedem der Julianischen Daten in j und das wird die Anzahl der Tage von der Timestamp Epoche (oder '1970-01-01'). Ich kann dann pd.to_datetime(j - epoch, unit='D') verwenden, um mir die Timestamps zu geben, wo jeder meiner Werte die Anzahl der Tage von der Timestamp Epoche darstellt.

Ich hoffe, das ist klar ;-)

zuerst die julian_date für die

epoch = pd.to_datetime(0, unit='s').to_julian_date() 

dann pd.Timestamp Epoche finden Umwandlung mit pd.to_datetime mit dem Parameter getan unit='D'

pd.to_datetime(j - epoch, unit='D') 

DatetimeIndex(['2016-01-01', '2016-01-01', '2016-01-21', '2016-01-21'], dtype='datetime64[ns]', freq=None) 
+0

perfekt funktioniert! Kannst du bitte ein bisschen erklären, was genau hier passiert? Ich habe die Logik der Epoche immer noch nicht verstanden –