Python pandas从多URL合并为单DataFrame出现concat报错如何解决
问题解决方法
报错核心原因
pd.read_html()函数返回值为当前页面所有匹配表格组成的列表,即使页面只有1个表格,返回的也是[DataFrame]格式的列表,而非直接返回DataFrame对象。你直接将整个列表存入待拼接列表,pd.concat()自然无法识别列表类型的拼接对象。- 你的原始代码还存在三处可提前规避的语法问题:
- 导入pandas的语句
Import pandas首字母大写,不符合Python语法要求 today变量未提前定义,直接调用strftime方法会触发NameError- for循环下的代码没有正确缩进,运行时会触发缩进错误
- 导入pandas的语句
修正后的完整代码
import pandas as pd from datetime import date from tabulate import tabulate # 补充today变量定义 today = date.today() final_date = today.strftime("%d.%m.%Y") power_data = ['https://transparency.entsoe.eu/transmission-domain/r2/scheduledCommercialExchangesDayAhead/show' '?name=&defaultValue=false&viewType=TABLE&areaType=BORDER_CTY&atch=false&dateTime.dateTime' '='+final_date+'+00:00|CET|DAY&border.values=CTY|10YFR-RTE------C!CTY_CTY|10YFR-RTE------C_CTY_CTY' '|10YBE----------2&direction.values=Export&direction.values=Import&dateTime.timezone' '=CET_CEST&dateTime.timezone_input=CET+(UTC+1)+/+CEST+(UTC+2)', 'https://transparency.entsoe.eu/transmission-domain/r2/scheduledCommercialExchangesDayAhead/show?name=&defaultValue=false&viewType=TABLE&areaType=BORDER_CTY&atch=false&dateTime.dateTime='+final_date+'+00:00|CET|DAY&border.values=CTY|10YFR-RTE------C!CTY_CTY|10YFR-RTE------C_CTY_CTY|10Y1001A1001A83F&direction.values=Export&direction.values=Import&dateTime.timezone=CET_CEST&dateTime.timezone_input=CET+(UTC+1)+/+CEST+(UTC+2)'] df_list = [] for url in power_data: # 取read_html返回列表的第一个元素,获取实际的DataFrame对象 table = pd.read_html(url, index_col=None, header=None) df = table[0] df_list.append(df) df_final = pd.concat(df_list, sort=False) df_final = df_final.drop_duplicates().reset_index(drop=True) print(tabulate(df_final.head(), headers='keys')) df_final.to_excel('power_data.xlsx', index=False)
关键修改说明
- 调用
pd.read_html()后取返回列表的第0位元素table[0],拿到实际的表格DataFrame再存入待拼接列表 - 修正了导入语句的大小写错误,补充了
today变量的定义逻辑 - 修正了for循环下代码的缩进错误
- 导出Excel时新增
index=False参数,避免把无用的索引列也写入文件
内容的提问来源于stack exchange,提问作者jjj
相关产品推荐
相关产品推荐

