pandas循环处理时无法向CSV文件追加新行报numpy.float64不可调用错误
错误根源
你触发报错的核心原因是变量命名和Python内置函数冲突:
你用了Python内置的文件打开函数名open作为变量,存储计算得到的开盘价数值,此时open会被覆盖为numpy.float64类型的浮点数。后续执行with open(...)打开文件的逻辑,相当于尝试把一个浮点数作为函数调用,直接触发TypeError: 'numpy.float64' object is not callable报错。
解决方法
把存储开盘价的变量名修改为非内置函数的名称即可,比如改为open_price,同步调整字典中的赋值即可。
修正后的完整代码
import pandas as pd import csv def getOHLC_df(df): grouped = df.groupby('symbol') df_final = pd.DataFrame() # 全局变量csv_data如果没用到可以删掉 global csv_data for name, group in grouped: group = group.sort_values('timestamp') timestamp = group['timestamp'].iloc[0] symbol = name # 修改变量名,避免和内置open函数冲突 open_price = group['ltp'].iloc[0] close = group['ltp'].iloc[-1] high = group['ltp'].max() low = group['ltp'].min() data = { 'timestamp': timestamp, 'symbol': symbol, 'open': open_price, 'close': close, 'high': high, 'low': low, } # pandas的append方法已废弃,新版本可替换为pd.concat df_final = pd.concat([df_final, pd.DataFrame([data])], ignore_index=True) df_final = df_final.reindex(['timestamp', 'symbol', 'open', 'high', 'low', 'close'], axis=1) field_names = ['timestamp', 'symbol', 'open', 'close', 'high', 'low'] with open(f'C:/Users/choud/Documents/{symbol}.csv','a') as f_object: dictwriter_object = csv.DictWriter(f_object, fieldnames=field_names) dictwriter_object.writerow(data) # with上下文会自动关闭文件,不需要手动调用close print(df_final)
其他注意事项
- 如果你提前创建的CSV文件还没有写入表头,第一次运行时可以在写入行之前加一行
dictwriter_object.writeheader()写入表头,避免后续读取文件出现列名缺失的问题。 - 代码中的全局变量
csv_data如果没有实际用到可以删除,避免不必要的全局变量污染。
内容的提问来源于stack exchange,提问作者Keshav Choudhary
相关产品推荐
相关产品推荐

