2015-03-25 21 views
5

Próbuję parsować plik Excel.xlsx do pliku csv. Tutaj jest plik Excel:Python xlrd parsować Excel xlsx do csv z konwersją daty

Date   Person 1  Person 2 
02/03/2015 Bob   James A  
03/03/2015 Billy  Nic  
04/03/2015 Sally  Mark  
05/03/2015 Alan   James A  
06/03/2015 James W  James A 

My Python skrypt:

import xlrd 
import csv 

book = xlrd.open_workbook('rota.xlsx') 

sheet = book.sheet_by_name('Sheet1') 

csvfile = open('output.csv', 'wb') 
wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

for rownum in range(sheet.nrows): 
    wr.writerow(sheet.row_values(rownum)) 

csvfile.close() 

wyprowadza jednak terminy takie jak ten:

Date,Person1,Person2 
41884,Bob,James B 
41885,Billy,Nic 
41886,Sally,Mark 
41887,Alan,James A 
41888,James W,James A 

Jestem świadomy funkcji xldate_as_tuple lub coś takiego aby przekonwertować wyjście do znaczących wartości, ale nie mogę wymyślić, jak z niego korzystać. Każda pomoc byłaby mi bardzo wdzięczna.

+1

Nie wydaje się, że * wypróbowano *, aby użyć 'xldate_as_tuple' - czemu nie? – jonrsharpe

+0

Nie wiem, gdzie umieścić to w moim kodzie, po prostu! – JamesPy

+0

Krzywa uczenia się dla mnie to ... – JamesPy

Odpowiedz

3

Oto jeden z możliwych rozwiązań:

import xlrd 
import csv 
from datetime import datetime 


book = xlrd.open_workbook('rota.xlsx') 
sheet = book.sheet_by_name('Sheet1') 
csvfile = open('output5.csv', 'wb') 

wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 
wr.writerow(sheet.row_values(0)) 

for rownum in range(1,sheet.nrows): 
    year, month, day, hour, minute, sec = xlrd.xldate_as_tuple(int(sheet.row_values(rownum)[0]), book.datemode) 
    py_date = datetime(year, month, day, hour, minute) 
    wr.writerow([py_date] + sheet.row_values(rownum)[1:]) 

csvfile.close() 

wyjściowa:

"Date  "," Person 1","Person 2" 
"2015-02-03 00:00:00"," Bob  ","James A " 
"2015-03-03 00:00:00"," Billy ","Nic  " 
"2015-04-03 00:00:00"," Sally ","Mark " 
"2015-05-03 00:00:00"," Alan ","James A " 
"2015-06-03 00:00:00","James W ","James A " 

Version2:

Kod:

#! /usr/bin/python 

import xlrd 
import csv 
from datetime import datetime 

book = xlrd.open_workbook('rota.xlsx') 
sheet = book.sheet_by_name('Sheet1') 
csvfile = open('output5.csv', 'wb') 
wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

for rownum in range(sheet.nrows): 
    date = sheet.row_values(rownum)[0] 
    if isinstance(date, float) or isinstance(date, int): 
     year, month, day, hour, minute, sec = xlrd.xldate_as_tuple(date, book.datemode) 
     py_date = "%02d/%02d/%04d" % (month, day,year) 
     wr.writerow([py_date] + sheet.row_values(rownum)[1:]) 
    else: 
     wr.writerow(sheet.row_values(rownum)) 
csvfile.close() 

wyjściowa:

"Date  "," Person 1","Person 2" 
"02/03/2015"," Bob  ","James A " 
"03/03/2015"," Billy ","Nic  " 
"04/03/2015"," Sally ","Mark " 
"05/03/2015"," Alan ","James A " 
"06/03/2015","James W ","James A " 
+0

Dziękuję, ale to daje mi błąd: Traceback (ostatnie ostatnie połączenie): Plik "pythonscript.py", wiersz 14, w rok, miesiąc, dzień, godzina, minuta, sec = xlrd.xldate_as_tuple (int (sheet.row_values ​​(rownum) [0]), book.datemode) ValueError: niepoprawny literał dla int() z base 10: '' Jakieś pomysły, jak sobie z tym poradzić? – JamesPy

+0

To oznacza, że ​​niektóre z wartości, które masz, nie są datami. Opublikowałem wersję 2, powinno działać. – Stanislav

+0

Bardzo dziękuję za pomoc - to jest doskonałe. plik csv wygląda dobrze, zmieniłem cytowanie = csv.QUOTE_ALL na delimiter = ',', aby uzyskać pożądane wyniki. Doskonały! Chcę przetworzyć teraz plik csv, aby wyświetlić nazwisko osoby, która jest w tym samym wierszu co bieżąca data. Czy jest to właściwy sposób, czy naprawdę powinienem zaimportować dane programu Excel do tablicy zamiast pliku csv? Może powinienem napisać nowe pytanie. Dziękuję bardzo za pomoc Stanislav !! – JamesPy