【问题标题】:Reading data from xlsx into Pandas dataframe将 xlsx 中的数据读入 Pandas 数据框
【发布时间】:2017-07-19 23:23:40
【问题描述】:

场景:我把这个小科学怪人的代码放在一起(在 SO 用户的一些很棒的帮助下)从 excel 文件中获取数据并放入 pandas 数据框。

我正在尝试做的事情:我正在尝试从可能包含一个或多个数据工作表的文件中获取数据。之后,我打算相应地组织数据框。例如:

date1    identifier 1    bid     ask
date1    identifier 2    bid     ask
date1    identifier 3    bid     ask
date2    identifier 1    bid     ask
date2    identifier 3    bid     ask
date3    identifier 4    bid     ask
date3    identifier 5    bid     ask

Obs1:每个文件都可以在单独的工作表中包含“投标”、“要求”或两者的值。

Obs2:不同文件的标识符和日期可能相同,也可能不同。

到目前为止我做了什么:我当前的代码读取文件和每个工作表。如果它遵循条件,它会附加到特定的数据帧。然后它会修复列标题。

问题:当我的代码运行时,由于某种原因,它会产生两个空数据帧。

问题:我如何考虑不同的工作表并将相应的值(到上面的结构)输出到数据框?

当前代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import glob, os
import datetime as dt
from datetime import datetime
import matplotlib as mpl
from openpyxl import load_workbook


directory = os.path.join("C:\\","Users\\DGMS\\Desktop\\final 2")        
list_of_dfs = []
dfbid = pd.DataFrame()
dfask = pd.DataFrame()

for root,dirs,files in os.walk(directory):

    for file in files:

        f = os.path.join(root, file)

        wb = load_workbook(f)

        for sheet in wb.worksheets:
            if sheet == "Bid":
                dfbid = pd.concat([dfbid, pd.read_excel(f, "Bid")])
                for i in range(1,len(dfbid.columns)):
                    dfbid.columns.values[i] = pd.to_datetime(dfbid.columns.values[i])

            elif sheet == "Ask":
                dfask = pd.concat([dfask, pd.read_excel(f, "Ask")])
                for i in range(1,len(dfask.columns)):
                    dfask.columns.values[i] = pd.to_datetime(dfask.columns.values[i])

【问题讨论】:

    标签: python excel pandas dataframe


    【解决方案1】:

    将您的代码在不同函数中所做的不同事情分开。

    • 查找 excel 文件
    • 读取 excel 文件
    • 将内容转换为datetime
    • 连接数据帧

    这样您就可以分别检查和检查每个步骤,而不是全部交织在一起

    查找 excel 文件

    import pandas as pd
    from pathlib import Path
    
    root_dir = Path(r"C:\Users\DGMS\Desktop\final 2")
    
    files = root_dir.glob('**/*.xlsx')
    

    读取 excel 文件

    读取每个文件并返回工作表'Bid''Ask',然后生成2个Dataframes列表

    def parse_workbook(file):
        d = pd.read_excel(file, sheetname=None)
        return d.get('Bid', None), d.get('Ask', None)
    
    df_bid_dfs, df_ask_dfs = zip(*(parse_workbook(file) for file in files))
    

    将内容转换为datetime

    def parse_datetime(df):
        for column_name, column in df.iteritems():
            df[column_name] = pd.to_datetime(column)
        return df
    

    连接数据帧

    df_bid = pd.concat(parse_datetime(df) for df in df_bid_dfs if df)
    df_ask = pd.concat(parse_datetime(df) for df in df_ask_dfs if df)
    

    测试parse_datetime 和连接

    df1 = pd.DataFrame(['20170718'])
    df2 = pd.DataFrame(['20170719'])
    df_bid_dfs = (df1, df2)
    
    pd.concat(parse_datetime(df) for df in df_bid_dfs)
    
        0
    0   2017-07-18
    0   2017-07-19
    

    【讨论】:

    • 据我所知concat 与生成器表达式一起使用。也许不是所有版本?
    • 非常感谢您的回答。关于连接过程的一个问题:假设我的一些文件有一些重复的列(日期)或重复的行(标识符),我的连接目标是将任何新列添加到末尾(所有列的左侧),以及任何新行到最后(底部)。如果已经有一列,它只是添加一个新行,如果已经有该行,它只是添加到新列。连接过程可以自动执行吗?还是我需要一次连接一个轴?
    • 顺便说一句,我尝试运行您的代码,但有两个问题:首先,我不断收到未定义的“文件”。其次,我认为代码不考虑只有“投标”或只有“询问”工作表的文件。可以循环考虑吗?
    • 哪一行给出了file未定义的错误?你知道Path.glob 返回一个迭代器,它在迭代时耗尽?当bidAsk 不在工作簿中时,我添加了代码
    • 我更改了那部分代码,现在它产生了“未知字符串格式错误”。前面是:文件“C:\Users\DGMS\Anaconda3\lib\site-packages\dateutil\parser.py”,第 1168 行,解析返回 DEFAULTPARSER.parse(timestr, **kwargs) 文件“C:\Users\ DGMS\Anaconda3\lib\site-packages\dateutil\parser.py",第 559 行,解析中引发 ValueError("Unknown string format")
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2020-12-12
    • 2017-04-24
    • 2020-01-29
    • 2023-03-15
    • 2020-11-06
    • 2018-03-23
    相关资源
    最近更新 更多