#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 постфактум преобразует его в дату, но это кажется более сложным, чем должно быть… Спасибо