我正在为来自一个租户的数据建立数据管道,这些租户以Excel文件的形式提供数据:每周一个工作簿,而工作簿中的每一页代表一天。我们无法控制格式,但是过程必须足够灵活以处理工作簿和工作表中的各种名称。这也需要在Python中进行,因为我们不允许执行宏或VBA(不是我的政策)。
我已经尝试过在循环中使用pd.read_Excel()
,但是它当前会以数据帧字典的形式返回输出,并且pd.concat()
函数会引发错误。我需要定义一个执行以下操作的过程:
最终,将其设置为每月脚本,该脚本将指向要导入最新数据的目录。在运行全年的数据之前,我目前正在一些工作簿上对其进行测试。代码中的某些打印功能仅用于临时输出检查。 我当前的代码,并抛出错误:
import pandas as pd
import os
# Once functioning, re-implement as a def
# Get list of Excel files in the working directory
os.getcwd()
os.chdir('d:\\projects\\chassis\\data')
os.getcwd()
files = os.listdir()
wkbks = [f for f in files if f[-4:] =='xlsx']
输出:['1-1 through 1-5.xlsx', '1-14 through 1-19.xlsx', '1-21 through 1-26.xlsx']
如果我在工作簿的完整列表上运行它:
# skiprows and usecols are to handle original sheet format, which has extraneous header rows
df = pd.read_excel(wkbks, sheet_name=None, ignore_index=True, skiprows=6, usecols=8)
cdf = pd.concat(df.values())
它引发错误:Invalid file path or buffer object type: <class 'list'>
如果我仅使用df = pd.read_excel(wkbks[1], sheet_name=None, ignore_index=True, skiprows=6, usecols=8)
在单个工作簿上运行它,那么它将返回一个列表字典,如下所示:
OrderedDict([('Mon 1.14 to 1.15', Carrier ID Carrier Name Mission \
0 XPOR XPO PORT SERVICES, INC. Dropoff
1 CCOO DECO LOGISTICS, INC. Dropoff
2 AMPF AMERICAN PACIFIC FORWARDERS, INC Dropoff
3 GPON GOLD POINT TRANSPORTATION, INC. Dropoff
4 FXTR FOX TRANSPORTATION, INC. Dropoff
尝试将此字典与df2 = pd.concat([pd.concat(v) for k,v in df.items()])
串联会引发错误:TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
我觉得这接近工作,但是我缺少以下步骤:
答案 0 :(得分:1)
您可以对文件夹中的所有文件使用glob
,然后由concat
和最后DataFrame.append
到最后DataFrame
一起加入:
import glob
all_data = pd.DataFrame()
path = 'd:/projects/chassis/data/*.xlsx'
for f in glob.glob(path):
df = pd.read_excel(f, sheet_name=None, ignore_index=True, skiprows=6, usecols=8)
cdf = pd.concat(df.values())
all_data = all_data.append(cdf,ignore_index=True)
print(all_data)