Назначение даты и времени в качестве индекса не дает DatetimeIndex - PullRequest
0 голосов
/ 08 декабря 2018

У моего df есть поле под названием "дни".Мне нужно создать datetime из "days" и startdate.Возможно, громоздко, но это работает:

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')

Я получаю:

Ошибка типа: Действительна только с DatetimeIndex,TimedeltaIndex или PeriodIndex, но получил экземпляр «Index»

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

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

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

Способ обойти это:

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

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

1 Ответ

0 голосов
/ 08 декабря 2018

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

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

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

посмотрите документацию 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)}")

out:

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'> против <class 'datetime.date'>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...