Pandas дает неверный результат, когда спрашивает, имеют ли значения столбца Timestamp значение attr

С колонкой, содержащей Timestamp значения, я получаю противоречивые результаты о том, имеют ли элементы атрибут astype:

In [30]: o.head().datetime.map(lambda x: hasattr(x, 'astype'))
Out[30]: 
0    False
1    False
2    False
3    False
4    False
Name: datetime, dtype: bool

In [31]: map(lambda x: hasattr(x, 'astype'), o.head().datetime.values)
Out[31]: [True, True, True, True, True]

In [32]: o.datetime.dtype
Out[32]: dtype('<M8[ns]')

In [33]: o.datetime.head()
Out[33]: 
0   2012-09-30 22:00:15.003000
1   2012-09-30 22:00:16.203000
2   2012-09-30 22:00:18.302000
3   2012-09-30 22:03:37.304000
4   2012-09-30 22:05:17.103000
Name: datetime, dtype: datetime64[ns]

Если я выберу первый элемент (или любой отдельный элемент) и спросить, есть ли у него атрибут astypeЯ вижу, что это так, и я даже могу конвертировать в другие форматы.

Но если я наберу, чтобы сделать это для всего столбца за один раз, с Series.mapЯ получаю сообщение об ошибке Timestamp объекты не имеют атрибута astype (хотя они явно делают).

Как я могу добиться сопоставления операции с колонкой с помощью Pandas? Это известная ошибка?

Версия: pandas 0.13.0, numpy 1.8

добавленной

Похоже, что это некое неявное приведение в действие либо панда, либо numpy:

In [50]: hasattr(o.head().datetime[0], 'astype')
Out[50]: False

In [51]: hasattr(o.head().datetime.values[0], 'astype')
Out[51]: True

1 ответ

Решение

Временные метки не имеют метода Astype. Но numpy.datetime64 делает.

NDFrame.values возвращает массив NumPy.o.head().datetime.values возвращает пустой массив dtype numpy.datetime64вот почему

In [31]: map(lambda x: hasattr(x, 'astype'), o.head().datetime.values)
Out[31]: [True, True, True, True, True]

Обратите внимание, что Series.__iter__ определяется следующим образом:

def __iter__(self):
    if  com.is_categorical_dtype(self.dtype):
        return iter(self.values)
    elif np.issubdtype(self.dtype, np.datetime64):
        return (lib.Timestamp(x) for x in self.values)
    elif np.issubdtype(self.dtype, np.timedelta64):
        return (lib.Timedelta(x) for x in self.values)
    else:
        return iter(self.values)

Итак, когда d-тип Серии np.datetime64итерация серии возвращает метки времени. Здесь происходит неявное преобразование.

Другие вопросы по тегам