#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 ), который выполняет преобразование типа.