Почему pd.Timestamp преобразуется в np.datetime64 при вызове '.values'? - PullRequest
2 голосов
/ 07 ноября 2019

При доступе к DataFrame.values все pd.Timestamp объекты преобразуются в np.datetime64 объекты, почему? Может существовать np.ndarray, содержащий pd.Timestamp объекты, поэтому я не понимаю, почемубудет ли такое автоматическое преобразование всегда произойти.

Знаете ли вы, как это предотвратить?

Минимальный пример:

import numpy as np
import pandas as pd
from datetime import datetime

# Let's declare an array with a datetime.datetime object
values = [datetime.now()]
print(type(values[0]))
> <class 'datetime.datetime'>

# Clearly, the datetime.datetime objects became pd.Timestamp once moved to a pd.DataFrame
df = pd.DataFrame(values, columns=['A'])
print(type(df.iloc[0][0]))
> <class 'pandas._libs.tslibs.timestamps.Timestamp'>

# Just to be sure, lets iterate over each datetime and manually convert them to pd.Timestamp
df['A'].apply(lambda x: pd.Timestamp(x))
print(type(df.iloc[0][0]))
> <class 'pandas._libs.tslibs.timestamps.Timestamp'>

# df.values (or series.values in this case) returns an np.ndarray
print(type(df.iloc[0].values))
> <class 'numpy.ndarray'>

# When we check what is the type of elements of the '.values' array, 
# it turns out the pd.Timestamp objects got converted to np.datetime64
print(type(df.iloc[0].values[0]))
> <class 'numpy.datetime64'>


# Just to double check, can an np.ndarray contain pd.Timestamps?
timestamp = pd.Timestamp(datetime.now())
timestamps = np.array([timestamp])
print(type(timestamps))
> <class 'numpy.ndarray'>

# Seems like it does. Why the above conversion then?
print(type(timestamps[0]))
> <class 'pandas._libs.tslibs.timestamps.Timestamp'>

python: 3.6.7.final.0

Панды: 0,25,3

Numpy: 1,16,4

1 Ответ

1 голос
/ 07 ноября 2019

Вся идея .values заключается в следующем:

Возвращает Numpy представление DataFrame. [документы]

Я считаю логичным, что pd.Timestamp затем «понижается» до dtype, который является родным для numpy. Если этого не произойдет, тогда какова цель .values?

Если вы хотите сохранить pd.Timestamp dtype, я бы предложил работать с оригинальным Series (df.iloc[0]). Я не вижу другого пути, поскольку .values использует np.ndarray для преобразования в соответствии с источником на Github.

...