недопустимое продвижение типа при выполнении np.где поле — тип даты

#python #python-3.x #pandas #numpy #date

#python #python-3.x #панды #numpy #Дата

Вопрос:

Итак, у меня есть набор данных о ценах и днях для списка акций.

Данные сортируются по биржевому тикеру, а затем по дате

Для каждой строки я хочу иметь возможность получать цену закрытия на следующую дату, а также на следующую дату. В случае, когда символы разные, мне нужны нулевые значения. Это работает для поля даты, если дата является типом объекта, но приводит к недопустимому повышению типа, если поле имеет тип datetime .

Так, например

 Symbol   Date          Price

A        2020-01-01  50

A        2020-01-02  51

B        2020-01-01  101
 

Я бы хотел, чтобы поле NextClose было равно 51 для первой записи, а значение NextDate было равно 2020-12-02

Для второй записи я бы хотел, чтобы оба значения были равны нулю, потому что символ меняется

 df = pd.DataFrame({"Date": ["2020-01-01", "2020-01-02","2020-01-03"],
                   "Symbol": ["A","A","B"],
                   "Price": [50, 51, 101]})


/*this works */

df['NextClose']=np.where(df['Symbol'] ==df ['Symbol'].shift(-1),df ['Price'].shift(-1).round(4),np.nan)
df['NextDate']=np.where(df['Symbol'] ==df ['Symbol'].shift(-1),df ['Date'].shift(-1),np.nan)
 
/* this gives the invalid type promotion error */

df["NewDate"]=pd.to_datetime(df["Date"])
df['NextNewDate']=np.where(df['Symbol'] ==df ['Symbol'].shift(-1),df ['NewDate'].shift(-1),np.nan)
 

Есть идеи, что я могу сделать, чтобы заполнить поле NextClose значением null, когда поле имеет тип datetime?

Спасибо

Примечание:

 df['NextNewDate']=np.where(df['Symbol'] ==df ['Symbol'].shift(-1),df ['NewDate'].shift(-1),pd.NaT)
 

Не выдает ошибку, а возвращает результат в эпоху времени (1577923200000000000)

 df['NextNewDate']=pd.to_datetime(df["NextNewDate"])
 

Добавление этого после возвращает правильную дату, но, похоже, это дополнительный шаг

Комментарии:

1. Не могли бы вы вставить небольшой раздел кода, в котором ваши данные, чтобы мы знали типы столбцов, np.nan выглядят так, как будто это не дата и время. pd.NaT это то, чего ты хочешь….

2. Таким образом, такого рода работы df[‘NextNewDate’]=np.where(df[‘Symbol’] ==df [‘Symbol’].shift(-1),df [‘newDate’].shift(-1),pd.NaT) не выдадут ошибку. Однако результирующее значение выдается как время эпохи, то есть «1577923200000000000» . Преобразование с использованием pd.to_datetime постфактум преобразует его в дату, но это кажется более сложным, чем должно быть… Спасибо