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

如何在带DateTime索引的Pandas DataFrame/CSV中添加行

解决CSV实时追加API数据的问题

问题场景

需要每分钟通过API获取单条行情数据,追加到CSV文件实现实时更新,但现有代码导致数据横向错位拼接,或报错无法正常追加:

原有代码

num_points = 1

df_setup = ig_service.fetch_historical_prices_by_epic_and_num_points(epic, resolution, num_points)
df_setup_prices_ask = df_setup['prices']['ask'] 
panda_df = pd.DataFrame(df_setup_prices_ask)
time.sleep(60)

while True:
    stream_close_price = ig_service.fetch_historical_prices_by_epic_and_num_points(epic, resolution, num_points)
    df_last_close = stream_close_price['prices']['ask'] 
    
    df_test = pd.DataFrame(df_last_close)
    
    combined_data = pd.concat([panda_df,df_test], axis=1)
    
    combined_data.to_csv('data.csv')
    
    print(df_last_close)
    
    time.sleep(60)

错误现象

  • CSV数据横向拼接,列重复错位:
DateTime,Open,High,Low,Close,Open,High,Low,Close
2022-09-21 14:34:00,143.992,143.995,143.99,143.992,,,,
2022-09-21 14:36:00,,,,,143.977,143.978,143.975,143.978
  • 改用join方法触发列重复错误:
ValueError: columns overlap but no suffix specified: Index(['Open', 'High', 'Low', 'Close'], dtype='object')
  • 使用merge方法生成空CSV文件

错误原因

  1. 原有代码用pd.concat([...], axis=1)是横向拼接列,而非需求的纵向追加行,导致列重复错位;
  2. join报错是因为两个DataFrame列名完全一致,无后缀区分;
  3. merge空文件是因为数据无匹配的关联键(如DateTime未正确作为索引或匹配值)。

正确实现方案

核心思路:每次获取的新数据是一行记录,需纵向追加到CSV文件末尾,第一次写入时保留表头,后续追加跳过表头。

修正后的代码

import pandas as pd
import time

num_points = 1

# 初始化:获取第一条数据并写入CSV(包含表头)
df_initial = ig_service.fetch_historical_prices_by_epic_and_num_points(epic, resolution, num_points)
df_initial_ask = df_initial['prices']['ask'] 
df_initial_df = pd.DataFrame(df_initial_ask)
# 第一次写入,index=False避免生成默认索引列
df_initial_df.to_csv('data.csv', index=False)

time.sleep(60)

while True:
    # 获取最新单条数据
    df_latest = ig_service.fetch_historical_prices_by_epic_and_num_points(epic, resolution, num_points)
    df_latest_ask = df_latest['prices']['ask'] 
    df_latest_df = pd.DataFrame(df_latest_ask)
    
    # 追加到CSV:mode='a'表示追加模式,header=False跳过表头
    df_latest_df.to_csv('data.csv', mode='a', header=False, index=False)
    
    print(df_latest_ask)
    time.sleep(60)

说明

  • mode='a':以追加模式打开文件,避免覆盖原有数据;
  • header=False:后续追加时不重复写入表头,保持CSV格式规范;
  • index=False:不将DataFrame的默认索引写入CSV,避免多余列。

内容的提问来源于stack exchange,提问作者Nikolas Weichert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:51:04