You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python函数间传日期参数触发AttributeError错误的解决求助

问题解决:AttributeError: 'str' object has no attribute 'strftime'

问题根源

  1. 变量作用域错误:修改后的fut_data直接引用了外部的exp_dt变量,但该变量不在函数的作用域范围内,无法直接访问。
  2. 参数类型不匹配:oi_data返回的是字符串格式的日期,而derivatives_df的expiry_date参数要求传入date/datetime对象,字符串类型无法被该方法处理,从而触发AttributeError。

修复方案

步骤1:修改oi_data返回date对象

将oi_data中返回字符串的逻辑改为返回date类型对象,直接满足derivatives_df的参数要求:

def oi_data(Symbols):
  baseurl = "https://www.nseindia.com/"
  url = f'https://www.nseindia.com/api/option-chain-equities'
  headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36','accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'}
  session = requests.Session()
  request = session.get(baseurl, headers=headers, timeout=30)
  cookies = dict(request.cookies)
  params=[('symbol', Symbols)]
  res = session.get(url, headers=headers, params=params, cookies=cookies, timeout=30)
  res_text = res.text
  data = json.loads(res_text)
  exp_dt1 = data["records"]["expiryDates"][0]
  datetime_obj = datetime.strptime(exp_dt1, '%d-%b-%Y')
  # 返回date对象而非字符串
  exp_dt = datetime_obj.date()
  print(exp_dt)
  return exp_dt

步骤2:给fut_data添加expiry_date参数

修改fut_data,将expiry_date作为参数传入,解决作用域问题,同时接收正确类型的参数:

def fut_data(Symbols, expiry_date):
    ticker_df = derivatives_df(
        symbol=Symbols,
        from_date = date.today() - timedelta(days = 30),
        to_date= date.today(),
        expiry_date=expiry_date,
        instrument_type="FUTSTK"
    )
    fut_df = ticker_df
    print(fut_df)
    return fut_df

步骤3:调整调用逻辑

在循环中调用fut_data时,将oi_data返回的exp_dt作为参数传入:

Symbols = ['MARUTI']
for symbol in Symbols:
    exp_dt = oi_data(symbol)
    fut_df = fut_data(symbol, exp_dt)

完整修正代码

from jugaad_data.nse import derivatives_df
from datetime import timedelta, date
from datetime import datetime
import pandas as pd
import requests
import json

def oi_data(Symbols):
  baseurl = "https://www.nseindia.com/"
  url = f'https://www.nseindia.com/api/option-chain-equities'
  headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36','accept-language': 'en,gu;q=0.9,hi;q=0.8', 'accept-encoding': 'gzip, deflate, br'}
  session = requests.Session()
  request = session.get(baseurl, headers=headers, timeout=30)
  cookies = dict(request.cookies)
  params=[('symbol', Symbols)]
  res = session.get(url, headers=headers, params=params, cookies=cookies, timeout=30)
  res_text = res.text
  data = json.loads(res_text)
  exp_dt1 = data["records"]["expiryDates"][0]
  datetime_obj = datetime.strptime(exp_dt1, '%d-%b-%Y')
  exp_dt = datetime_obj.date()
  print(exp_dt)
  return exp_dt
  
def fut_data(Symbols, expiry_date):
    ticker_df = derivatives_df(
        symbol=Symbols,
        from_date = date.today() - timedelta(days = 30),
        to_date= date.today(),
        expiry_date=expiry_date,
        instrument_type="FUTSTK"
    )
    fut_df = ticker_df
    print(fut_df)
    return fut_df

Symbols = ['MARUTI']
for symbol in Symbols:
    exp_dt = oi_data(symbol)
    fut_df = fut_data(symbol, exp_dt)

内容的提问来源于stack exchange,提问作者Dr Brijesh K. Chaurasia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:22:33