2016-06-01 1 views
3

Я пытаюсь преобразовать временные метки эпохи эпохи Панды в человеко-читаемые времена. Есть как минимум два очевидных способа сделать это: pd.DatetimeIndex и pd.to_datetime(). Они, кажется, работают совершенно по-разному:Pandas DatetimeIndex vs to_datetime несоответствия

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) 

С to_datetime(), разрешение дисплея составляет миллисекунды, и .000 печатается на целых секунд. С DatetimeIndex разрешение дисплея составляет микросекунды (что мне нравится), но десятичная часть полностью опускается на целых секунды.

Затем попробуйте преобразование часового пояса:

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 

Это странно: функции часового пояса не работают с обычной серией даты и времени, только с DatetimeIndex. Почему это так? Метод tz_localize() существует и документируется здесь: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.tz_localize.html

Я пробовал Pandas 0.17.0 и 0.18.1 с теми же результатами.

Я не пытаюсь сделать фактический индекс, поэтому при прочих равных условиях я ожидал использовать to_datetime(). Я просто не могу использовать методы часового пояса для работы с ним.

ответ

3

Есть 1 способ конвертировать вещи, pd.to_datetime(), да, вы можете напрямую построить DatetimeIndex, но это ограничение по назначению, а to_datetime довольно гибкое.

Так to_datetime даст вам подобный предмет того, что вы ввода, если входной массив типа, то вы получите DatetimeIndex, ввести Series вы получите Series.

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

По умолчанию он будет конвертировать с unit='ns' который выстраивается здесь

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) 

Так одна вещь, которую мы могли бы сделать, это сделать серию из этого. Индекс здесь INTEGER, значения - это даты.

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] 

Затем вы можете использовать .dt аксессор работать на значений. Series.tz_localize действует на индекс.

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

ОК, так что это работает: 'pd.to_datetime (NANOS) .dt.tz_localize ('UTC') dt.tz_convert ('US/Eastern')' - но документы для 'Series.tz_localize (.) ', похоже, вообще не упоминается' dt', так что это довольно непонятно. Спасибо за помощь специалиста. Вы знаете, как я могу заставить Pandas всегда печатать часть микросекунд, даже если она равна нулю? –

+0

http://pandas.pydata.org/pandas-docs/stable/timeseries.html#time-date-components tons of docs – Jeff

+0

Я надеялся на что-то похожее на 'pd.options.display.max_rows', который контролирует, как вещи печатаются без необходимости переопределять код печати. Наверное, мне не повезло. –

 Смежные вопросы

  • Нет связанных вопросов^_^