Преобразование метки времени Pandas в родную дату и время Python не работает

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь преобразовать DatetimeIndex с метками времени Pandas в индекс с родными для Python объектами Datetime.

Вот мой воспроизводимый пример:

 import pandas as pd
import numpy as np

length = 5
dateIndex = pd.date_range(start='1/1/2018', periods=length, freq="H")

df = pd.DataFrame(np.random.randint(0,length,size=(length, 6)), columns=["Open","High","Low","Close","Volume","OpenInterest"], index=dateIndex)

df.index[0]
## returns Timestamp('2018-01-01 00:00:00', freq='H')

df.index.to_pydatetime()
## returns
array([datetime.datetime(2018, 1, 1, 0, 0),
       datetime.datetime(2018, 1, 1, 1, 0),
       datetime.datetime(2018, 1, 1, 2, 0),
       datetime.datetime(2018, 1, 1, 3, 0),
       datetime.datetime(2018, 1, 1, 4, 0)], dtype=object)
  

НО:

 df.index = df.index.to_pydatetime()
type(df.index[0])
## returns pandas._libs.tslibs.timestamps.Timestamp
  

Почему я не вижу собственный DatetimeObject?

Ответ №1:

Pandas использует свой собственный объект timestamp для своих индексов (имеет смысл, потому что родная дата-время python не реализует все, что нужно интерфейсу pandas).

Вы можете проверить это на этом примере:

 >>> df.index.map(lambda x: f'{x} as {type(x)}')
Index(['2018-01-01 00:00:00 as <class 'pandas._libs.tslibs.timestamps.Timestamp'>',
       '2018-01-01 01:00:00 as <class 'pandas._libs.tslibs.timestamps.Timestamp'>',
       '2018-01-01 02:00:00 as <class 'pandas._libs.tslibs.timestamps.Timestamp'>',
       '2018-01-01 03:00:00 as <class 'pandas._libs.tslibs.timestamps.Timestamp'>',
       '2018-01-01 04:00:00 as <class 'pandas._libs.tslibs.timestamps.Timestamp'>'],
      dtype='object')
  

Итак, что происходит, когда вы пытаетесь установить индекс с помощью объектов pydatetime, подобных этому?

 df.index = df.index.to_pydatetime()
  
  • Сначала python вызывает df.index.to_pydatetime()
  • И у вас есть ndarray объектов datetime в правой части назначения.
  • Затем python вызывает df.index.equals (возвращаемый ndarray ), который выполняет преобразование типа.