2017-03-31 24 views
0

我試圖將xlsx文件轉換爲一個包含頭文件和另一個包含實際數據的CSV文件的CSV文件。 我有以下要求:如何在Python中將n行xlsx轉換爲csv,同時保留日期值

  1. 頭並不在第一行,但在start_line排發車。
  2. 日期不應被視爲浮動,但以某種字符串格式。
  3. 我不知道該文件的行或列的總數事先。我也不想指定哪一列是日期。

使用pandas我陷在數字1 我想在兩個單獨的讀,我從start_line到start_line+1start_line+1到最後閱讀實現這一目標。 然而,它似乎是not possible從偏移量中讀取n行。下面是我用來獲取包含頭文件的一個文件的代碼。

import pandas as pd 
def parse_excel(file,start_line,sheet,table): 
    sh = pd.read_excel(file,sheet,skiprows=start_line) 
    sh.to_csv("output.csv",sep='\t',encoding='utf-8',index=False) 

接下來,我曾嘗試使用xlrd但這個庫將所有日期像在Excel中浮動。這裏唯一的解決方法似乎是go through all individual cells,這似乎不是很有效或編碼不錯。我現在擁有的一切:

import xlrd 
def parse_excel(file,start_line,sheet,table): 
    with xlrd.open_workbook(file) as wb: 
     sh = wb.sheet_by_name(sheet) 
     header_written = False 
     with open('{0}.csv'.format(table),'wb') as csv_file: 
      wr = csv.writer(csv_file,delimiter='\t') 
      for rownum in range(sh.nrows): 
       if not header_written and start_line == rownum: 
        with open('{0}_header.csv'.format(table),'wb') as header: 
         hwr = csv.writer(header,delimiter='\t') 
         hwr.writerow(sh.row_values(rownum)) 
         header_written = True 
       elif header_written: 
        wr.writerow(sh.row_values(rownum)) 

請指出我的其他解決方案/庫,展現出解決方法無論是上述的一個或解釋爲什麼我應該去爲xlrd解決方法檢查每一個單獨的單元格。

+0

您應該可以使用'header'參數來設置列名的行號。把它與'skip_rows'結合起來,我認爲這應該處理數字1.使用'parse_dates'來傳遞一個列日期列。爲了將數值轉換爲日期,我相信您需要在第二行代碼中使用'pd.to_datetime'並設置'unit'參數。 –

+0

@TedPetrou'pandas'實際上按照我的意願對待日期:)。你可以告訴我如何使用'header'參數並提取標題嗎?這確實能解決我的問題。 – spijs

+0

對列名所在的行號使用整數。有關更多詳細信息,請參閱文檔:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html –

回答

1

只要您的所有數據都低於您的標題行,那麼下面就應該可以工作。假設標題行在行n(索引從0開始,而不是像Excel一樣)。

df = pd.read_excel('filepath', header=n) 
df.head(0).to_csv('header.csv', index=False) 
df.to_csv('output.csv', header=None, index=False) 
+0

修改它以匹配我的代碼。這確實有用,謝謝。 – spijs