如何基于另一DataFrame的唯一日期值为新DataFrame设置日期索引?
问题解决:正确设置日期字段为DataFrame索引并指定索引名
问题背景
想基于DataFrame data 的expiration_date字段唯一值生成新的date_df,要求把该日期字段设为索引,且索引名为expiration_date,但遇到以下问题:
- 执行
date_df.set_index('expiration_date', inplace=True)时触发KeyError,提示找不到该列 - 调整代码后出现索引格式异常(比如1970年初始日期和目标日期并存)、索引名无法正确设置
错误原因分析
- 列名不匹配:用
pd.DataFrame(data["expiration_date"].unique())创建date_df时,生成的DataFrame列名是默认的0,不是expiration_date,所以set_index找不到对应列。 - 错误转换索引:之前把
date_df的默认整数索引(0、1、2...)转成日期,这会被解析为1970-01-01开始的时间戳,导致出现无关的初始日期。
正确实现步骤
方法一:先创建带指定列名的DataFrame,再设为索引
# 生成包含唯一日期的DataFrame,指定列名为'expiration_date' date_df = pd.DataFrame(data["expiration_date"].unique(), columns=['expiration_date']) # 将'expiration_date'列设置为索引,索引名自动沿用列名 date_df.set_index('expiration_date', inplace=True)
方法二:直接用唯一日期创建索引,再生成DataFrame
# 获取唯一日期并转为DatetimeIndex unique_dates = pd.DatetimeIndex(data["expiration_date"].unique()) # 创建DataFrame并指定索引、索引名 date_df = pd.DataFrame(index=unique_dates) date_df.index.name = 'expiration_date'
完整修正后的代码
替换原代码中# create date 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"]) # 优化日期提取逻辑,精准匹配6位日期码(如240920对应2024-09-20) data['expiration_date'] = '20' + data['option'].str.extract(r'[A-Z](\d{6})')[0] data["expiration_date"] = pd.to_datetime(data["expiration_date"], format="%Y%m%d") # 正确创建date_df并设置索引 date_df = pd.DataFrame(data["expiration_date"].unique(), columns=['expiration_date']) date_df.set_index('expiration_date', inplace=True) print(date_df.index) print(date_df.index.name) print(date_df)
补充说明
- 原代码中日期提取的正则
r"[A-Z](\d+)"可能提取到非6位数字,建议用r'[A-Z](\d{6})'精准匹配期权代码中的日期段,避免pd.to_datetime解析出错。 - 用
set_index设置索引后,索引名会自动沿用原列名,无需额外手动设置;若用方法二创建,则需要手动指定index.name。
内容的提问来源于stack exchange,提问作者user1470034
相关产品推荐
相关产品推荐

