2015-03-25 16 views
5

Ich versuche, eine Excel.xlsx-Datei zu einer CSV-Datei zu analysieren. Hier ist die Excel-Datei:Python xlrd analysieren Excel xlsx zu csv mit Datum Konvertierung

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 

Mein Python-Skript:

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

aber es gibt die Daten wie folgt aus:

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

Ich bin mir bewusst, der xldate_as_tuple Funktion oder so etwas wie dieses um die Ausgabe in sinnvolle Werte zu konvertieren, aber ich kann nicht herausfinden, wie man es benutzt. Jede Hilfe wäre ich sehr dankbar. Hier

+1

Sie scheinen nicht * versucht * 'xldate_as_tuple' zu ​​verwenden - warum nicht? – jonrsharpe

+0

Ich weiß nicht, wo ich es ganz einfach in meinen Code schreiben soll! – JamesPy

+0

Lernkurve für mich ist das ... – JamesPy

Antwort

3

ist eine mögliche Lösung:

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

Ausgang:

"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:

Code:

#! /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() 

Ausgang:

"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

Vielen Dank, aber das gibt mir einen Fehler: Traceback (letzten Anruf zuletzt): Datei "Pythonscript.py", Zeile 14, in Jahr, Monat, Tag, Stunde, Minute, sec = xlrd.xldate_as_tuple (int (Blatt.Row_Values ​​(rownum) [0]), Buch.datemode) ValueError: ungültiges Literal für int() mit Basis 10: '' Irgendwelche Ideen, wie Sie damit umgehen? – JamesPy

+0

Das bedeutet, dass einige der Werte, die Sie haben, keine Daten sind. Ich habe Version 2 gepostet, es sollte funktionieren. – Stanislav

+0

Ich danke Ihnen sehr für Ihre Hilfe - das ist perfekt. Die CSV-Datei sieht gut aus, ich habe quoting = csv.QUOTE_ALL in delimiter = ',' geändert, um die gewünschte Ausgabe zu erhalten. Ausgezeichnet! Ich möchte jetzt die CSV-Datei verarbeiten, um den Namen der Person anzuzeigen, die sich in der gleichen Zeile wie das aktuelle Datum befindet. Ist das der richtige Weg, oder sollte ich wirklich die Excel-Daten in ein Array anstelle einer CSV-Datei importieren? Vielleicht sollte ich eine neue Frage stellen. Vielen Dank für Ihre Hilfe Stanislav !! – JamesPy