Повторная выборка Pandas вызывает ошибку типа для индекса, состоящего из объектов datetime - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь выполнить повторную выборку очень простого фрейма данных, который завершается неудачей со следующим исключением:

TypeError: Допустимо только с DatetimeIndex, TimedeltaIndex или PeriodIndex, но получил экземпляр 'Index'

Я прочитал документы по API pandas и просмотрел десятки примеров, и я не могу понять, что я делаю неправильно.

# %%
import pandas as pd
print(f"pandas version: {pd.__version__}\n\n")

data = pd.DataFrame({"created": ['2019-03-07T11:01:07.361+0000',
                                 '2019-06-05T15:09:51.203+0100',
                                 '2019-06-05T15:09:51.203+0100'],
                     "value": [10, 20, 30]})

# %%
print(f"original type: {type(data.created[0])}\n")
data.info()

# %%
data.created = pd.to_datetime(data.created)

# %%
print(f"updated type: {type(data.created[0])}\n")
data.info()

# %%
data.set_index("created", inplace=True)
data.info()

# %%
data.resample("D").mean()

Вот результат

pandas version: 0.24.2

original type: <class 'str'>

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
created    3 non-null object
value      3 non-null int64
dtypes: int64(1), object(1)
memory usage: 128.0+ bytes
updated type: <class 'datetime.datetime'>

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
created    3 non-null object
value      3 non-null int64
dtypes: int64(1), object(1)
memory usage: 128.0+ bytes
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 2019-03-07 11:01:07.361000+00:00 to 2019-06-05 15:09:51.203000+01:00
Data columns (total 1 columns):
value    3 non-null int64
dtypes: int64(1)
memory usage: 48.0+ bytes
Traceback (most recent call last):
  File "c:/Users/me/dev/misc/index.py", line 32, in <module>
    data.resample("D").mean()
  File "C:\Users\me\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py", line 8155, in resample
    base=base, key=on, level=level)
  File "C:\Users\me\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\resample.py", line 1250, in resample
    return tg._get_resampler(obj, kind=kind)
  File "C:\Users\me\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\resample.py", line 1380, in _get_resampler
    "but got an instance of %r" % type(ax).__name__)
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'Index, but got an instance of 'Index'

1 Ответ

1 голос
/ 20 сентября 2019

Давайте начнем с некоторых принципов:

  1. Чтобы сделать повторную выборку , источник Series или DataFrame долженнапример, иметь DatetimeIndex (не «обычный» индекс).

  2. Вы можете set_index к этому столбцу, но для этого все Элементы Datetime должны находиться в одном и том же часовом поясе (ваши данные не совпадают).

Таким образом, вы можете действовать следующим образом:

  1. При преобразовании созданного столбца в Datetime (часть вашего кода), передайте utc = True , чтобы "объединить"часовой пояс:

    data.created = pd.to_datetime(data.created, utc=True)
    
  2. Установите индекс, после чего вы можете выполнить повторную выборку:

    data.set_index('created').resample("D").mean()
    

Другой вариант: вместо set_index , вы можете передать на параметр, указав столбец Datetime (-подобный):

data.resample("D", on='created').mean()

, но в этом столбце все еще должны быть все записи в одном часовом поясе.

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