是否为数据帧副本到另一个数据帧的日期设置索引



我正试图使用唯一值从另一个数据帧的副本中在数据帧上创建日期索引。我的问题是索引不允许我将索引名称设置为过期日期,因为它无法识别密钥

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.00000002022-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的消息。

正如你所看到的,我到处都是,在日期字段上为数据帧分配索引的正确方法是什么?

评论的代码是我被卡住的地方:

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)

如果您想创建一个DataFrame,它是您的第一个"数据";DataFrame,具有"expiration_date"列的唯一值,并将其索引设置为此列。您可以使用以下代码:

# copy data DataFrame and set its index as expiration_date
date_df = data.set_index("expiration_date")
# drop duplicated index
date_df=date_df[~date_df.index.duplicated(keep='first')]

您现有代码的问题与此行date_df = pd.DataFrame(data["expiration_date"].unique())有关。这一行创建从0到长度的索引DataFrame;0";从而获得你独特的价值观。如果这是你想要的,你可以改变这行像:

date_df = pd.DataFrame(data["expiration_date"].unique(),columns=["expiration_date"])
date_df.set_index('expiration_date', inplace=True)

最新更新