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

使用Pandas与Datetime从YFinance更新AAPL.csv数据及报错修复

问题:更新Yahoo Finance股票数据时的日期格式错误

我有一个名为AAPL.csv的Yahoo Finance旧数据文件,数据如下:

日期OpenHighLowCloseVolume
2023-09-25174.19176.97174.14176.0846172700
2023-09-26174.82175.19171.66171.9664588900
2023-09-27172.61173.03169.05170.4266921800
2023-09-28169.33172.02167.61170.6956294400
2023-09-29172.02173.07170.33171.2151814200

我需要对比当前日期与文件中最新行的日期,更新缺失的最新数据并保存回原文件。编写了如下代码,但存在日期格式问题无法正常运行:

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:


解决建议

错误原因分析

  1. 日期计算逻辑错误:直接提取日部分相减会忽略月份/年份差异,跨月时结果无意义,且代码中可能因解析问题导致dif_day_dates类型异常。
  2. 依赖缺失与变量未定义:未导入yfinance(即yf),symbol、timeframes_codedata未定义,无法正常下载数据。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:05:12