python - read - xlrd cell_type
Cómo usar `` xlrd.xldate_as_tuple() `` (5)
Esto es lo que uso para convertir automáticamente las fechas:
cell = sheet.cell(row, col)
value = cell.value
if cell.ctype == 3: # xldate
value = datetime.datetime(*xlrd.xldate_as_tuple(value, workbook.datemode))
No estoy muy seguro de cómo usar la siguiente función:
xlrd.xldate_as_tuple
para los siguientes datos
xldate:39274.0
xldate:39839.0
¿Podría alguien darme un ejemplo sobre el uso de la función para los datos?
La documentación de la función (menos la lista de posibles excepciones):
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).
Como autor de xlrd, estoy interesado en saber cómo se puede mejorar la documentación. ¿Podría por favor responder a estos:
¿Leíste la sección general sobre fechas (citada por @msw)?
¿Leíste la documentación específica anterior de la función?
¿Puede sugerir alguna mejora en la documentación?
¿Realmente intentaste ejecutar la función, así:
>>> 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)
>>>
Quoth la documentación :
Fechas en hojas de cálculo Excel
En realidad, no hay tales cosas. Lo que tienes son números de punto flotante y esperanza piadosa. Hay varios problemas con las fechas de Excel:
(1) Las fechas no se almacenan como un tipo de datos separado; se almacenan como números de punto flotante y tiene que confiar en (a) el "formato de número" que se les aplica en Excel y / o (b) saber qué celdas deben tener fechas. Este módulo ayuda con (a) inspeccionando el formato que se ha aplicado a cada celda numérica; Si parece ser un formato de fecha, la celda se clasifica como una fecha en lugar de un número. Se agradecería recibir comentarios sobre esta función, especialmente de los entornos locales que no hablan inglés.
(2) Excel para Windows almacena las fechas de forma predeterminada como el número de días (o fracción de ellos) desde 1899-12-31T00: 00: 00. Excel para Macintosh utiliza una fecha de inicio predeterminada de 1904-01-01T00: 00: 00. El sistema de fechas se puede cambiar en Excel por libro (por ejemplo: Herramientas -> Opciones -> Cálculo, marque la casilla "Sistema de fechas 1904"). Por supuesto, esto es una mala idea si ya hay fechas en el libro de trabajo. No hay una buena razón para cambiarlo, incluso si no hay fechas en el libro de trabajo. El sistema de fechas en uso se registra en el libro de trabajo. Un libro de trabajo transportado de Windows a Macintosh (o viceversa) funcionará correctamente con el host Excel. Cuando use la función xldate_as_tuple de este módulo para convertir números de un libro de trabajo, debe usar el atributo datemode del objeto Libro. Si adivina, o hace un juicio dependiendo de dónde cree que se creó el libro de trabajo, corre el riesgo de quedar 1462 días fuera de control.
Referencia: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q180162
(3) La implementación de Excel del sistema de fechas basado en Windows 1900 por defecto funciona bajo la premisa incorrecta de que 1900 fue un año bisiesto. Interpreta el número 60 como 1900-02-29, que no es una fecha válida. En consecuencia, cualquier número menor de 61 es ambiguo. Ejemplo: ¿59 es el resultado de 1900-02-28 ingresado directamente, o es 1900-03-01 menos 2 días? El programa OpenOffice.org Calc "corrige" el problema de Microsoft; al ingresar 1900-02-27 se almacena el número 59. Guarde como un archivo XLS, luego abra el archivo con Excel; verá 1900-02-28 en pantalla.
Referencia: http://support.microsoft.com/default.aspx?scid=kb;en-us;214326
que cito aquí porque es probable que la respuesta a su pregunta sea incorrecta a menos que lo tenga en cuenta.
Entonces, para poner esto en el código sería algo como:
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)
lo que le da una fecha y hora de Python en py_date
que le permite realizar operaciones útiles utilizando el módulo de datetime y datetime estándar.
Nunca he usado xlrd, y mi ejemplo está completamente inventado, pero si hay un myfile.xls
y realmente tiene un número de fecha en la celda F20, y usted no es muy exigente con la precisión como se indicó anteriormente, este código debería trabajo.
Utilízalo como such :
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)