使用Pandas与Datetime从YFinance更新AAPL.csv数据及报错修复
问题:更新Yahoo Finance股票数据时的日期格式错误
我有一个名为AAPL.csv的Yahoo Finance旧数据文件,数据如下:
| 日期 | Open | High | Low | Close | Volume |
|---|---|---|---|---|---|
| 2023-09-25 | 174.19 | 176.97 | 174.14 | 176.08 | 46172700 |
| 2023-09-26 | 174.82 | 175.19 | 171.66 | 171.96 | 64588900 |
| 2023-09-27 | 172.61 | 173.03 | 169.05 | 170.42 | 66921800 |
| 2023-09-28 | 169.33 | 172.02 | 167.61 | 170.69 | 56294400 |
| 2023-09-29 | 172.02 | 173.07 | 170.33 | 171.21 | 51814200 |
我需要对比当前日期与文件中最新行的日期,更新缺失的最新数据并保存回原文件。编写了如下代码,但存在日期格式问题无法正常运行:
import os import datetime import pandas as pd import dateutil.parser from datetime import datetime read_data = pd.read_csv('AAPL.csv') read_last_date_df = str(read_data['Date'].values[-1]) last_date_df = dateutil.parser.isoparse(read_last_date_df) today = datetime.today() dif_day_dates = int(today.strftime('%d')) - int(last_date_df.strftime('%d')) if dif_day_dates > 0: update_data = yf.download(symbol, start=datetime.today() - last_date_df, end=datetime.today(), interval=timeframes_codedata['daily']) read_data[len(read_data)] = update_data read_data.to_csv('AAPL.csv')
出现报错:
TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'
报错位置:if dif_day_dates > 0:
解决建议
错误原因分析
- 日期计算逻辑错误:直接提取日部分相减会忽略月份/年份差异,跨月时结果无意义,且代码中可能因解析问题导致
dif_day_dates类型异常。 - 依赖缺失与变量未定义:未导入
yfinance(即yf),symbol、timeframes_codedata未定义,无法正常下载数据。 - DataFrame合并方式错误:
read_data[len(read_data)] = update_data不是Pandas合并数据的正确方式,会导致索引混乱或数据丢失。
修正后的完整代码
import pandas as pd import yfinance as yf from datetime import datetime # 读取CSV并解析日期列为datetime索引 read_data = pd.read_csv('AAPL.csv', parse_dates=['日期'], index_col='日期') # 获取本地数据的最新日期(仅保留日期部分,排除时间干扰) last_date_df = read_data.index[-1].date() # 获取当前日期(仅日期部分) today = datetime.today().date() # 判断当前日期是否晚于本地最新数据日期 if today > last_date_df: # 从本地最新日期的下一天开始下载数据,避免重复 start_date = last_date_df + pd.Timedelta(days=1) # 下载AAPL的最新数据 update_data = yf.download('AAPL', start=start_date, end=today, interval='1d') # 重命名列名,匹配本地CSV的列名(若本地列名是英文则可跳过此步) update_data.rename(columns={ 'Open': 'Open', 'High': 'High', 'Low': 'Low', 'Close': 'Close', 'Volume': 'Volume' }, inplace=True) # 合并新旧数据 combined_data = pd.concat([read_data, update_data]) # 重置索引并保存,确保日期列为普通列而非索引 combined_data.reset_index(inplace=True) combined_data.to_csv('AAPL.csv', index=False, encoding='utf-8')
关键优化点
- 日期解析优化:读取CSV时直接解析日期列并设为索引,简化日期对比逻辑。
- 正确的日期判断:通过
date()方法提取纯日期部分,避免时间戳干扰,直接对比日期大小。 - 避免重复数据:从本地最新日期的次日开始下载数据,保证数据不重复。
- 规范数据合并:使用
pd.concat合并DataFrame,这是Pandas中合并数据的标准方式。 - 依赖补全:明确导入
yfinance,定义必要的下载参数(如股票代码AAPL、时间间隔1d)。
额外注意事项
- 先安装
yfinance依赖:pip install yfinance - 股票市场非交易日(周末、节假日)不会返回数据,无需额外处理,
yfinance会自动跳过这些日期。 - 避免重复导入
datetime模块,保持导入方式统一。
内容的提问来源于stack exchange,提问作者Optimvs
相关产品推荐
相关产品推荐

