Come usare `` xlrd.xldate_as_tuple () ``
Domanda
Non sono del tutto sicuro di come utilizzare la seguente funzione:
xlrd.xldate_as_tuple
per i seguenti dati
xldate:39274.0
xldate:39839.0
Potrebbe qualcuno per favore mi dia un esempio di utilizzo della funzione per i dati?
Soluzione
Le date in fogli di calcolo Excel
In realtà, non ci sono queste cose. Quello che avete sono in virgola mobile numeri e pia speranza. Ci sono diversi problemi con le date di Excel:
(1) Le date non sono memorizzati come un separato tipo di dati; questi vengono memorizzati come galleggiante puntare i numeri e si deve fare affidamento su (A) il "formato numerico" applicato a li in Excel e / o (b) sapere quale le cellule si suppone di avere date loro. Questo modulo aiuta con (a) ispezionando il formato che è stato applicata a ciascuna cella numero; se sembra essere un formato di data, la cella è classificato come una data piuttosto che un numero. Feedback su questa caratteristica, in particolare da non di lingua inglese locali, sarebbe apprezzato.
(2) Excel per memorizza le date di Windows da predefinito come il numero di giorni (o frazione) dal 1899-12-31T00: 00: 00. Excel per Macintosh utilizza una data di inizio predefinita di 1904-01-01T00: 00: 00. Il sistema di data può essere modificato in Excel su un base per-cartella di lavoro (ad esempio: Strumenti -> Opzioni -> Calcolo, spuntare la casella "sistema data 1904"). Questo è di Naturalmente una cattiva idea se ci sono già date nella cartella di lavoro. Non c'è buon motivo per cambiarlo anche se non ci sono date nella cartella di lavoro. Quale sistema di data è in uso è registrato in la cartella di lavoro. Una cartella di lavoro trasportato da Windows a Macintosh (o vice versa) funziona correttamente con la ospiterà Excel. Quando si utilizza questo modulo di la funzione per convertire xldate_as_tuple numeri da una cartella di lavoro, è necessario utilizzare l'attributo datemode del Libro oggetto. Se si indovina, o fare un giudizio a seconda di dove si credono che la cartella di lavoro è stato creato, è correre il rischio di essere 1462 giorni fuori venendo meno.
Riferimento: http://support.microsoft.com/default.aspx?scid = KB; EN-US; q180162
(3) L'attuazione della Excel sistema di data-default di Windows 1900-based lavora sulla premessa erronea che 1900 è stato un anno bisestile. interpreta il numero 60 nel senso 1900/02/29, che non è una data valida. Conseguentemente qualsiasi numero inferiore a 61 è ambigua. Esempio: 59 è la risultato di 1900/02/28 entrato direttamente, o è 1900-03-01 meno 2 giorni? Il programma OpenOffice.org Calc "corregge" il problema di Microsoft; entrata 1900/02/27 provoca il numero 59 di essere immagazzinato. Salvare come file XLS, quindi aprire il file con Excel - vedrete 1900/02/28 visualizzato.
Riferimento: http://support.microsoft.com/default.aspx?scid = kb; en-us; 214326
che cito qui perché la risposta alla tua domanda è probabile che sia sbagliato a meno che non tenerne conto.
Quindi, per mettere questo in codice sarebbe qualcosa come:
import datetime
import xlrd
book = xlrd.open_workbook("myfile.xls")
sheet = book.sheet_by_index(0)
cell = sheet.cell(5, 19) # type, <class 'xlrd.sheet.Cell'>
if sheet.cell(5, 19).ctype == 3: # 3 means 'xldate' , 1 means 'text'
ms_date_number = sheet.cell_value(5, 19) # Correct option 1
ms_date_number = sheet.cell(5, 19).value # Correct option 2
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(ms_date_number,
book.datemode)
py_date = datetime.datetime(year, month, day, hour, minute, nearest_second)
che vi dà un datetime Python in py_date
che si può fare operazioni utili su utilizzando lo standard datetime modulo.
Non ho mai usato XLRD, e il mio esempio è completamente costituito, ma se c'è un myfile.xls
e ha davvero un numero data nella cella F20, e non sono troppo esigente in fatto di precisione come osservato in precedenza, questo codice dovrebbe funzionare.
Altri suggerimenti
La documentazione della funzione (meno la lista dei possibili eccezioni):
xldate_as_tuple (xldate, datemode) [#]
Convert an Excel number (presumed to represent a date, a datetime or a time) into a tuple suitable for feeding to datetime or mx.DateTime constructors. xldate The Excel number datemode 0: 1900-based, 1: 1904-based. WARNING: when using this function to interpret the contents of a workbook, you should pass in the Book.datemode attribute of that workbook. Whether the workbook has ever been anywhere near a Macintosh is irrelevant. Returns: Gregorian (year, month, day, hour, minute, nearest_second).
Come l'autore di XLRD, mi interessa sapere come la documentazione può essere fatta meglio. La prego di rispondere a queste:
Hai letto sezione generale sulle date (citato da @msw)?
Hai letto la documentazione specifica al di sopra della funzione?
Potete suggerire alcun miglioramento nella documentazione?
Avete in realtà tenta l'esecuzione della funzione, in questo modo:
>>> import xlrd
>>> xlrd.xldate_as_tuple(39274.0, 0)
(2007, 7, 11, 0, 0, 0)
>>> xlrd.xldate_as_tuple(39274.0 - 1.0/60/60/24, 0)
(2007, 7, 10, 23, 59, 59)
>>>
Usa come quali :
number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_tuple(number, book_datemode)
import datetime as dt
import xlrd
log_dir = 'C:\\Users\\'
infile = 'myfile.xls'
book = xlrd.open_workbook(log_dir+infile)
sheet1 = book.sheet_by_index(0)
date_column_idx = 1
## iterate through the sheet to locate the date columns
for rownum in range(sheet1.nrows):
rows = sheet1.row_values(rownum)
## check if the cell is a date; continue otherwise
if sheet1.cell(rownum, date_column_idx).ctype != 3 :
continue
install_dt_tuple = xlrd.xldate_as_tuple((rows[date_column_idx ]), book.datemode)
## the "*date_tuple" will automatically unpack the tuple. Thanks mfitzp :-)
date = dt.datetime(*date_tuple)
Ecco quello che uso per convertire automaticamente le date:
cell = sheet.cell(row, col)
value = cell.value
if cell.ctype == 3: # xldate
value = datetime.datetime(*xlrd.xldate_as_tuple(value, workbook.datemode))