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?

È stato utile?

Soluzione

la documentazione :

  

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))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top