Что меняет тип даты в этом коде панд? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть фрейм данных в Пандах, в котором есть даты и некоторые другие данные. Даты явно имеют тип datetime.date. Для примера я заставляю это вручную. В реальной проблеме кадр импортируется из внешнего источника, уже настроенного таким образом. После манипулирования индексированием я обнаружил, что мои даты относятся к классу pandas._libs.tslib.Timestamp, что приводит к несовместимости с более поздним кодом. Что вызывает это изменение в типе / классе?

Минимальный рабочий пример (обратите внимание на различия между строками 3 и 7):

In [1]: df = pd.DataFrame({'date' : ['02/20/2015','01/15/2016','08/21/2015'],  'i' : ['Bob', 'Bob', 'Jim'] ,'v' : [1, 2, 3]})

In [2]: df['date'] = pd.to_datetime(df.date).dt.date

In [3]: print type(df.date[0])
<type 'datetime.date'>

In [4]: df.set_index(['i','date'], inplace=True)

In [5]: print type(df.loc['Bob',:].index[0])
<class 'pandas._libs.tslib.Timestamp'>

In [6]: df.reset_index(inplace=True)

In [7]: print type(df.date[0])
<class 'pandas._libs.tslib.Timestamp'>

1 Ответ

0 голосов
/ 09 июля 2019

Я боролся с этим часами и наконец отследил проблему до мультииндекса. В первоначальном контексте это было трудно определить, потому что многоиндексная операция появилась в середине большого набора операций, который включал нарезку, частичное индексирование и т. Д. Но суть в том, что тип дат конвертируется в строке 4 в приведенном выше примере, когда установлен мультииндекс, и после этого он остается в классе Pandas.

Если вместо этого я просто set_index('time'), например обычный (не мульти) индекс, нет преобразования типов. Это также усложняло отслеживание причины, поскольку я упростил операции индексации как первый шаг в отладке, что устранило проблему, которую я пытался отследить.

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