如何将Timestamp类型日期转换为整数值,适配Polyfit函数输入要求
报错根因
yfinance返回的DataFrame索引是Timestamp时间类型,不属于可直接转换为浮点数的字符串/数值类型,所以直接执行astype(float)会触发类型错误。你需要先将时间类型转换为数值型的时间度量,再传入np.polyfit使用。
推荐解法(无需循环,性能更高)
直接通过pandas矢量化操作完成转换,无需遍历DataFrame:
import yfinance as yf import numpy as np import matplotlib.pyplot as plt stock = 'TSLA' start = '2020-11-01' df = yf.download(stock , start=start) # 转换为距离起始统计日的天数(整数,符合polyfit输入要求) nfx = (df.index - df.index[0]).days.values # 直接提取收盘价数组 nfy = df['Close'].values # 可直接传入polyfit做拟合,示例为拟合1次线性函数 fit_coef = np.polyfit(nfx, nfy, deg=1) fit_func = np.poly1d(fit_coef)
兼容原有循环写法的修改方案
如果需要保留你原来的循环逻辑,只需调整x值的转换逻辑即可:
nfx = [] nfy = [] # 取起始日期作为基准 start_ts = df.index[0] for index, row in df.iterrows(): # 计算当前日期距基准日的天数,为整数格式 nfx.append((index - start_ts).days) nfy.append(row['Close'])
可选转换方式:转Unix时间戳
如果需要使用1970年1月1日以来的秒级整数时间戳作为x值,可使用如下转换方式:
# 秒级整数时间戳 nfx = df.index.astype('int64') // 10**9
内容的提问来源于stack exchange,提问作者BenjaminDiLorenzo
相关产品推荐
相关产品推荐

