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
итерация серии возвращает метки времени. Здесь происходит неявное преобразование.