Назначение даты и времени в качестве индекса не дает DatetimeIndex

В моем df есть поле под названием «дни». Мне нужно создать дату и время из «дней» и даты начала. Наверное, громоздко, но работает:

for t in df.index:
    df.loc[t,'date']=datetime.date(startdate)+
    datetime.timedelta(days=df.loc[t,'days'])
df.index=df.date

Когда я пытаюсь повысить частоту дискретизации:

udf=df.resample('M',how='sum')

Я получил:

TypeError: действует только с DatetimeIndex, TimedeltaIndex или PeriodIndex, но получил экземпляр «Index»

Если я устанавливаю индекс с полем даты и времени, почему индекс не становится индексом даты и времени (или «DatetimeIndex»)? Каждая запись в «дате» и индексе являются датой и временем, не так ли?

type(df.date[0])
<type 'datetime.date'>

type(df.index[0])
<type 'datetime.date'>

Путь вокруг этого:

df.index=pd.to_datetime(df.index)

Но я не могу найти никакого объяснения, почему назначение существующей даты и времени индексу не работает, но преобразование существующей даты и времени (df.index) в дату и время через pd.to_datetime (df.index) работает.


person Wesley Kitlasten    schedule 07.12.2018    source источник


Ответы (1)


Pandas не преобразует собственные объекты datetime Python в объекты Timestamp, из которых можно создать datetimeindexs. Чтение документации pandas.DatetimeIndex поможет.

Проблема в том, что наличие объектов datetime для столбца даты не создает объект pandas Timestamp. Pandas Timestamp является заменой Pandas для datetime.datetime

Timestamp — это эквивалент даты и времени Python в pandas, и в большинстве случаев он взаимозаменяем. Это тип, используемый для записей, которые составляют DatetimeIndex и другие структуры данных, ориентированные на временные ряды, в pandas.

проверьте pandas.Timestamp документация

df = pd.DataFrame(np.random.randn(10,4), columns = list('abcd')) # sample df
df.index = pd.date_range(start='2018-1-1', end='2018-1-10') # use pandas to create a date range and set index
df['date'] = pd.date_range(start='2018-1-1', end='2018-1-10') # also set as column values
print(f"date column type: {type(df['date'][0])}\ndate index type: {type(df.index)}\n")

df['date'] = df['date'].apply(lambda x: datetime.date(x)) # convert pandas timestamp to datetime.date
print(f"type for datetime.date: {type(df['date'][0])}")

df.set_index('date', inplace=True) # set datetime.date as index
print(f"type for datetime.date as index: {type(df.index)}")

вне:

date column type: <class 'pandas._libs.tslibs.timestamps.Timestamp'>
date index type: <class 'pandas.core.indexes.datetimes.DatetimeIndex'>

type for datetime.date: <class 'datetime.date'>
type for datetime.date as index: <class 'pandas.core.indexes.base.Index'>

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

<class 'pandas._libs.tslibs.timestamps.Timestamp'> vs <class 'datetime.date'>

person It_is_Chris    schedule 08.12.2018