我正在尝试使用唯一值从另一个 Dataframe 的副本创建一个 Dataframe 上的日期索引。我的问题是,索引不允许我将索引名设置为过期日期,因为它无法识别键
import pandas as pd
import requests
raw_data = requests.get(f"https://cdn.cboe.com/api/global/delayed_quotes/options/SPY.json")
dict_data = pd.DataFrame.from_dict(raw_data.json())
spot_price = dict_data.loc["current_price", "data"]
# create dataframe from options key
data = pd.DataFrame(dict_data.loc["options", "data"])
data['expiration_date'] = str(20) + data['option'].str.extract((r"[A-Z](d+)")).astype(str)
data["expiration_date"] = pd.to_datetime(data["expiration_date"], format="%Y-%m-%d")
# create date dataframe
date_df = pd.DataFrame(data["expiration_date"].unique())
date_df.index = pd.to_datetime(date_df.index)
date_df.set_index('expiration_date', inplace=True)
print(date_df.index)
print(date_df.index.name)
print(date_df)
这给出了错误:KeyError: "None of ['expiration_date'] are in the columns"
如果我使用:date_df.index = pd.to_datetime(date_df.index)
,我可以接近
然而,我得到了一个奇怪的格式,它变成了‘1970-01-01 00:00:00.000000000 2022-09-21’
我尝试添加, format="%Y-%m-%d"
,但它不会改变格式。
如果我使用date_df.index = pd.to_datetime(date_df.index).strftime("%Y-%m-%d")
,它确实修复了日期格式,但我仍然使用1970-01-01,并且我的index_name仍然是NONE。
使用date_df.index.names = ['expiration_date']
将允许我将索引名更改为过期日期,但我的索引仍然是0,并且它为日期1970添加了一列,这是我不想要的。
0
expiration_date
1970-01-01 2022-09-21
现在,如果我尝试设置索引,仍然会看到列中没有EXPIRATION_DATE。
正如您所看到的,为日期字段上的 Dataframe 分配索引的正确方法是什么?
注解代码就是我遇到的问题:
date_df = pd.DataFrame(data["expiration_date"].unique())
date_df.index.names = ['expiration_date']
date_df.index = pd.to_datetime(date_df.index).strftime("%Y-%m-%d")
# date_df.set_index('expiration_date', inplace=True)
print(date_df.index.name)
print(date_df)
1条答案
按热度按时间v8wbuo2f1#
如果您想创建一个DataFrame,它是您的第一个“data”DataFrame的副本,它具有‘EXPIRATION_DATE’列的唯一值,并将其索引设置为此列,您可以使用以下代码:
您现有代码的问题与行
date_df = pd.DataFrame(data["expiration_date"].unique())
有关。该行创建索引从0到长度的DataFrame,它的第一列“0”获取您的唯一值。如果这是您想要的,您可以更改该行,如下所示: