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.
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? –
http://pandas.pydata.org/pandas-docs/stable/timeseries.html#time-date-components Tonnen von Dokumenten – Jeff
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. –