Python函数间传日期参数触发AttributeError错误的解决求助
问题解决:AttributeError: 'str' object has no attribute 'strftime'
问题根源
- 变量作用域错误:修改后的
fut_data直接引用了外部的exp_dt变量,但该变量不在函数的作用域范围内,无法直接访问。 - 参数类型不匹配:
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
相关产品推荐
相关产品推荐

