将日期的索引从一个 Dataframe 副本设置到另一个 Dataframe 副本?

b1uwtaje  于 2022-09-21  发布在  其他
关注(0)|答案(1)|浏览(173)

我正在尝试使用唯一值从另一个 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)
v8wbuo2f

v8wbuo2f1#

如果您想创建一个DataFrame,它是您的第一个“data”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)

相关问题