2016-06-01 16 views
3

Ich versuche, eine Pandas-Serie von Epochenzeitstempeln in menschenlesbare Zeiten zu konvertieren. Es gibt mindestens zwei offensichtliche Möglichkeiten, dies zu tun: pd.DatetimeIndex und pd.to_datetime(). Sie scheinen ganz unterschiedliche Weise zu arbeiten:Pandas DatetimeIndex vs to_datetime Diskrepanzen

In [1]: import pandas as pd 

In [3]: nanos = pd.Series([1462282258000000000, 1462282258100000000, 1462282258200000000]) 

In [4]: pd.to_datetime(nanos) 
Out[4]: 
0 2016-05-03 13:30:58.000 
1 2016-05-03 13:30:58.100 
2 2016-05-03 13:30:58.200 
dtype: datetime64[ns] 

In [5]: pd.DatetimeIndex(nanos) 
Out[5]: 
DatetimeIndex([  '2016-05-03 13:30:58', '2016-05-03 13:30:58.100000', 
       '2016-05-03 13:30:58.200000'], 
       dtype='datetime64[ns]', freq=None) 

Mit to_datetime(), die Display-Auflösung ist Millisekunden und .000 auf ganze Sekunden gedruckt. Bei DatetimeIndex ist die Bildschirmauflösung Mikrosekunden (was ich mag), aber der Dezimalteil wird für ganze Sekunden komplett weggelassen.

Dann versuchen, die Zeitzone konvertieren:

In [12]: pd.DatetimeIndex(nanos).tz_localize('UTC')     
Out[12]: 
DatetimeIndex([  '2016-05-03 13:30:58+00:00', 
       '2016-05-03 13:30:58.100000+00:00', 
       '2016-05-03 13:30:58.200000+00:00'], 
       dtype='datetime64[ns, UTC]', freq=None) 

In [13]: pd.to_datetime(nanos).tz_localize('UTC') 
TypeError: index is not a valid DatetimeIndex or PeriodIndex 

Das ist seltsam: die Zeitzone Funktionen arbeiten nicht mit einer einfachen Datetime-Serie, nur mit einem DatetimeIndex. Warum sollte das sein? Die tz_localize() Methode existiert und ist hier dokumentiert: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.tz_localize.html

Ich habe Pandas 0.17.0 und 0.18.1 mit den gleichen Ergebnissen versucht.

Ich versuche nicht, einen tatsächlichen Index zu machen, so dass alles andere gleich wäre, hätte ich erwartet, to_datetime() zu verwenden - ich kann nicht Zeitzone Methoden, um damit zu arbeiten.

Antwort

3

Es gibt 1 Möglichkeit, Dinge zu konvertieren, pd.to_datetime(), ja können Sie direkt eine DatetimeIndex konstruieren, aber es ist absichtlich restriktiv, während to_datetime ziemlich flexibel ist.

So to_datetime geben Ihnen ein ähnliches Objekt, was Sie eingeben, wenn Sie Eingabe ein Array-like, dann werden Sie eine DatetimeIndex erhalten, geben Sie einen Series Sie eine Series bekommen.

In [5]: nanos = [1462282258000000000, 1462282258100000000, 1462282258200000000] 

Standardmäßig wird es mit einem unit='ns' konvertieren bis die Linien hier

In [7]: pd.to_datetime(nanos) 
Out[7]: DatetimeIndex(['2016-05-03 13:30:58', '2016-05-03 13:30:58.100000', '2016-05-03 13:30:58.200000'], dtype='datetime64[ns]', freq=None) 

So eine Sache, die wir tun könnten eine Serie aus diesem machen. Der Index ist hier INTEGER, die Werte sind Datetimes.

In [10]: s = Series(pd.to_datetime(nanos)) 

In [11]: s 
Out[11]: 
0 2016-05-03 13:30:58.000 
1 2016-05-03 13:30:58.100 
2 2016-05-03 13:30:58.200 
dtype: datetime64[ns] 

können Sie dann mit dem .dt Accessor auf den Werte zu betreiben. Series.tz_localize arbeitet auf dem Index.

In [12]: s.dt.tz_localize('US/Eastern') 
Out[12]: 
0   2016-05-03 13:30:58-04:00 
1 2016-05-03 13:30:58.100000-04:00 
2 2016-05-03 13:30:58.200000-04:00 
dtype: datetime64[ns, US/Eastern] 
+0

OK, so funktioniert das: 'pd.to_datetime (nanos) .dt.tz_localize ('UTC') dt.tz_convert ('US/Eastern')' - aber die Dokumentation für 'Series.tz_localize (.) '' überhaupt nicht 'dt' zu erwähnen, so dass es ziemlich nicht erkennbar ist. Danke für die kompetente Hilfe. Hast du eine Idee, wie ich Pandas dazu bringen kann, immer den Mikrosekunden-Teil zu drucken, selbst wenn es Null ist? –

+0

http://pandas.pydata.org/pandas-docs/stable/timeseries.html#time-date-components Tonnen von Dokumenten – Jeff

+0

Ich hatte auf etwas ähnlich wie 'pd.options.display.max_rows' gehofft, das die Dinge steuert werden gedruckt, ohne den Druckcode neu zu implementieren. Kein solches Glück, denke ich. –

Verwandte Themen