如何在带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文件
错误原因
- 原有代码用
pd.concat([...], axis=1)是横向拼接列,而非需求的纵向追加行,导致列重复错位; join报错是因为两个DataFrame列名完全一致,无后缀区分;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
相关产品推荐
相关产品推荐

