2017-07-19 56 views
0

場景:我把這個小小的Frankenstein代碼(來自SO用戶的一些很棒的幫助)放在一起,從excel文件中獲取數據並放入熊貓數據框中。從xlsx讀取數據到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:不同文件的標識符和日期可能相同,也可能不同。

我到目前爲止所做的:我目前的代碼讀取文件和每個工作表。如果符合條件,則附加到特定的數據幀。然後它修復了列標題。

Issue:當我的代碼運行時,出於某種原因它會產生兩個空的數據框。

問題:如何計算不同的工作表並將相應的值(對上述結構)輸出到數據框?

目前代碼:

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]) 

回答

2

獨立的不同的東西你的代碼做不同的功能。

  • 認準Excel的文件
  • 讀取Excel的文件
  • 內容轉換爲datetime
  • 串聯的DataFrames

這樣,您就可以檢查並單獨檢查每個步驟而不是全部交織在一起

尋找excel-files

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',然後生成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)) 

2所列出轉換的內容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 
+2

據我所知'concat'與發電機表達的作品。也許不是所有版本? –

+0

我添加了一些代碼來測試這最後一步 –

+0

很多感謝您的答案。關於連接過程的一個問題:假設我的一些文件有一些重複的列(日期)或重複的行(標識符),我的連接目標是將任何新列添加到結尾(所有列的左側)和任何新行到最後(底部)。如果已經有一列,它只是添加一個新行,如果已經有該行,它只是添加到新列。連接程序能自動執行該操作嗎?或者我需要一次連接一個軸? – DGMS89