From f490600d018c04f9bac56d67e0edfac393003b44 Mon Sep 17 00:00:00 2001 From: Jeff Tratner Date: Wed, 30 Oct 2013 19:01:01 -0400 Subject: [PATCH 1/2] ENH: read_excel: try converting numeric to int All Excel numeric data is stored as floats, so have to convert specifically. Changing default because it's suprising to save something with what looks like a row/column of integers and get a column of floats instead. (especially because it can lead to annoying Float64Indexes) --- pandas/io/excel.py | 26 +++++-- pandas/io/tests/data/test_types.xls | Bin 0 -> 26112 bytes pandas/io/tests/data/test_types.xlsx | Bin 0 -> 33722 bytes pandas/io/tests/test_excel.py | 99 ++++++++++++++++++++------- 4 files changed, 95 insertions(+), 30 deletions(-) create mode 100644 pandas/io/tests/data/test_types.xls create mode 100644 pandas/io/tests/data/test_types.xlsx diff --git a/pandas/io/excel.py b/pandas/io/excel.py index ae844d1eeb5fc..04550ca41ab90 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -83,6 +83,10 @@ def read_excel(io, sheetname, **kwds): engine: string, default None If io is not a buffer or path, this must be set to identify io. Acceptable values are None or xlrd + convert_float : boolean, default True + convert integral floats to int (i.e., 1.0 --> 1). If False, all numeric + data will be read in as floats: Excel stores all numbers as floats + internally. Returns ------- @@ -142,7 +146,7 @@ def __init__(self, io, **kwds): def parse(self, sheetname, header=0, skiprows=None, skip_footer=0, index_col=None, parse_cols=None, parse_dates=False, date_parser=None, na_values=None, thousands=None, chunksize=None, - **kwds): + convert_float=True, **kwds): """Read an Excel table into DataFrame Parameters @@ -172,6 +176,10 @@ def parse(self, sheetname, header=0, skiprows=None, skip_footer=0, NaN values are overridden, otherwise they're appended to verbose : boolean, default False Indicate number of NA values placed in non-numeric columns + convert_float : boolean, default True + convert integral floats to int (i.e., 1.0 --> 1). If False, all + numeric data will be read in as floats: Excel stores all numbers as + floats internally. Returns ------- @@ -191,7 +199,9 @@ def parse(self, sheetname, header=0, skiprows=None, skip_footer=0, parse_dates=parse_dates, date_parser=date_parser, na_values=na_values, thousands=thousands, chunksize=chunksize, - skip_footer=skip_footer, **kwds) + skip_footer=skip_footer, + convert_float=convert_float, + **kwds) def _should_parse(self, i, parse_cols): @@ -229,9 +239,11 @@ def _excel2num(x): def _parse_excel(self, sheetname, header=0, skiprows=None, skip_footer=0, index_col=None, has_index_names=None, parse_cols=None, parse_dates=False, date_parser=None, na_values=None, - thousands=None, chunksize=None, **kwds): + thousands=None, chunksize=None, convert_float=True, + **kwds): from xlrd import (xldate_as_tuple, XL_CELL_DATE, - XL_CELL_ERROR, XL_CELL_BOOLEAN) + XL_CELL_ERROR, XL_CELL_BOOLEAN, + XL_CELL_NUMBER) datemode = self.book.datemode if isinstance(sheetname, compat.string_types): @@ -260,6 +272,12 @@ def _parse_excel(self, sheetname, header=0, skiprows=None, skip_footer=0, value = np.nan elif typ == XL_CELL_BOOLEAN: value = bool(value) + elif convert_float and typ == XL_CELL_NUMBER: + # Excel 'numbers' are always floats + val = int(value) + if val == value: + value = val + row.append(value) data.append(row) diff --git a/pandas/io/tests/data/test_types.xls b/pandas/io/tests/data/test_types.xls new file mode 100644 index 0000000000000000000000000000000000000000..420ea6daebaa02161fe7fb3bd08bf886cbd8cc16 GIT binary patch literal 26112 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/test_types.xlsx b/pandas/io/tests/data/test_types.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8bb1dcec0d04b48221dde2c42fa0f99901ca1aef GIT binary patch literal 33722 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 DmO8_g literal 0 HcmV?d00001 diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index 15130c552c8a8..1e8f8b8896070 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -1,6 +1,7 @@ # pylint: disable=E1101 from pandas.compat import u, range, map +from datetime import datetime import os import unittest @@ -306,6 +307,54 @@ def test_reader_closes_file(self): self.assertTrue(f.closed) + def test_reader_special_dtypes(self): + _skip_if_no_xlrd() + + expected = DataFrame.from_items([ + ("IntCol", [1, 2, -3, 4, 0]), + ("FloatCol", [1.25, 2.25, 1.83, 1.92, 0.0000000005]), + ("BoolCol", [True, False, True, True, False]), + ("StrCol", [1, 2, 3, 4, 5]), + ("Str2Col", ["a", "b", "c", "d", "e"]), + ("DateCol", [datetime(2013, 10, 30), datetime(2013, 10, 31), + datetime(1905, 1, 1), datetime(2013, 12, 14), + datetime(2015, 3, 14)]) + ]) + + xlsx_path = os.path.join(self.dirpath, 'test_types.xlsx') + xls_path = os.path.join(self.dirpath, 'test_types.xls') + + # should read in correctly and infer types + for path in (xls_path, xlsx_path): + actual = read_excel(path, 'Sheet1') + tm.assert_frame_equal(actual, expected) + + # if not coercing number, then int comes in as float + float_expected = expected.copy() + float_expected["IntCol"] = float_expected["IntCol"].astype(float) + for path in (xls_path, xlsx_path): + actual = read_excel(path, 'Sheet1', convert_float=False) + tm.assert_frame_equal(actual, float_expected) + + # check setting Index (assuming xls and xlsx are the same here) + for icol, name in enumerate(expected.columns): + actual = read_excel(xlsx_path, 'Sheet1', index_col=icol) + actual2 = read_excel(xlsx_path, 'Sheet1', index_col=name) + exp = expected.set_index(name) + tm.assert_frame_equal(actual, exp) + tm.assert_frame_equal(actual2, exp) + + # convert_float and converters should be different but both accepted + expected["StrCol"] = expected["StrCol"].apply(str) + actual = read_excel(xlsx_path, 'Sheet1', converters={"StrCol": str}) + tm.assert_frame_equal(actual, expected) + + no_convert_float = float_expected.copy() + no_convert_float["StrCol"] = no_convert_float["StrCol"].apply(str) + actual = read_excel(xlsx_path, 'Sheet1', converters={"StrCol": str}, + convert_float=False) + tm.assert_frame_equal(actual, no_convert_float) + class ExcelWriterBase(SharedItems): # Base class for test cases to run with different Excel writers. @@ -390,7 +439,7 @@ def test_roundtrip(self): tm.assert_frame_equal(self.frame, recons) self.frame.to_excel(path, 'test1', na_rep='88') - recons = read_excel(path, 'test1', index_col=0, na_values=[88,88.0]) + recons = read_excel(path, 'test1', index_col=0, na_values=[88, 88.0]) tm.assert_frame_equal(self.frame, recons) def test_mixed(self): @@ -417,6 +466,16 @@ def test_tsframe(self): recons = reader.parse('test1') tm.assert_frame_equal(df, recons) + def test_basics_with_nan(self): + _skip_if_no_xlrd() + ext = self.ext + path = '__tmp_to_excel_from_excel_int_types__.' + ext + self.frame['A'][:5] = nan + self.frame.to_excel(path, 'test1') + self.frame.to_excel(path, 'test1', cols=['A', 'B']) + self.frame.to_excel(path, 'test1', header=False) + self.frame.to_excel(path, 'test1', index=False) + def test_int_types(self): _skip_if_no_xlrd() ext = self.ext @@ -425,20 +484,22 @@ def test_int_types(self): for np_type in (np.int8, np.int16, np.int32, np.int64): with ensure_clean(path) as path: - self.frame['A'][:5] = nan - - self.frame.to_excel(path, 'test1') - self.frame.to_excel(path, 'test1', cols=['A', 'B']) - self.frame.to_excel(path, 'test1', header=False) - self.frame.to_excel(path, 'test1', index=False) - - # Test np.int values read come back as float. + # Test np.int values read come back as int (rather than float + # which is Excel's format). frame = DataFrame(np.random.randint(-10, 10, size=(10, 2)), dtype=np_type) frame.to_excel(path, 'test1') reader = ExcelFile(path) - recons = reader.parse('test1').astype(np_type) - tm.assert_frame_equal(frame, recons, check_dtype=False) + recons = reader.parse('test1') + int_frame = frame.astype(int) + tm.assert_frame_equal(int_frame, recons) + recons2 = read_excel(path, 'test1') + tm.assert_frame_equal(int_frame, recons2) + + # test with convert_float=False comes back as float + float_frame = frame.astype(float) + recons = read_excel(path, 'test1', convert_float=False) + tm.assert_frame_equal(recons, float_frame) def test_float_types(self): _skip_if_no_xlrd() @@ -447,13 +508,6 @@ def test_float_types(self): for np_type in (np.float16, np.float32, np.float64): with ensure_clean(path) as path: - self.frame['A'][:5] = nan - - self.frame.to_excel(path, 'test1') - self.frame.to_excel(path, 'test1', cols=['A', 'B']) - self.frame.to_excel(path, 'test1', header=False) - self.frame.to_excel(path, 'test1', index=False) - # Test np.float values read come back as float. frame = DataFrame(np.random.random_sample(10), dtype=np_type) frame.to_excel(path, 'test1') @@ -468,13 +522,6 @@ def test_bool_types(self): for np_type in (np.bool8, np.bool_): with ensure_clean(path) as path: - self.frame['A'][:5] = nan - - self.frame.to_excel(path, 'test1') - self.frame.to_excel(path, 'test1', cols=['A', 'B']) - self.frame.to_excel(path, 'test1', header=False) - self.frame.to_excel(path, 'test1', index=False) - # Test np.bool values read come back as float. frame = (DataFrame([1, 0, True, False], dtype=np_type)) frame.to_excel(path, 'test1') @@ -1007,11 +1054,11 @@ def test_ExcelWriter_dispatch(self): writer = ExcelWriter('apple.xls') tm.assert_isinstance(writer, _XlwtWriter) - def test_register_writer(self): # some awkward mocking to test out dispatch and such actually works called_save = [] called_write_cells = [] + class DummyClass(ExcelWriter): called_save = False called_write_cells = False From 1ea301ea19b150385d7e8b2938e7b1760be31c26 Mon Sep 17 00:00:00 2001 From: Jeff Tratner Date: Thu, 31 Oct 2013 20:40:21 -0400 Subject: [PATCH 2/2] TST: Test for float --> int in the middle of object dtype --- doc/source/io.rst | 7 +++++++ doc/source/release.rst | 2 ++ pandas/io/excel.py | 3 ++- pandas/io/tests/data/test_types.xls | Bin 26112 -> 26112 bytes pandas/io/tests/data/test_types.xlsx | Bin 33722 -> 33769 bytes pandas/io/tests/test_excel.py | 4 +++- 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/source/io.rst b/doc/source/io.rst index 0842893800dd5..1a879866c5516 100644 --- a/doc/source/io.rst +++ b/doc/source/io.rst @@ -1839,6 +1839,13 @@ one can pass an :class:`~pandas.io.excel.ExcelWriter`. df1.to_excel(writer, sheet_name='Sheet1') df2.to_excel(writer, sheet_name='Sheet2') +.. note:: Wringing a little more performance out of ``read_excel`` + Internally, Excel stores all numeric data as floats. Because this can + produce unexpected behavior when reading in data, pandas defaults to trying + to convert integers to floats if it doesn't lose information (``1.0 --> + 1``). You can pass ``convert_float=False`` to disable this behavior, which + may give a slight performance improvement. + .. _io.excel.writers: Excel writer engines diff --git a/doc/source/release.rst b/doc/source/release.rst index 8a0e31859c185..721ef9a1cbbf3 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -207,6 +207,8 @@ Improvements to existing features closed]) - Fixed bug in `tools.plotting.andrews_curvres` so that lines are drawn grouped by color as expected. + - ``read_excel()`` now tries to convert integral floats (like ``1.0``) to int + by default. (:issue:`5394`) API Changes ~~~~~~~~~~~ diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 04550ca41ab90..42c212caf41ca 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -273,7 +273,8 @@ def _parse_excel(self, sheetname, header=0, skiprows=None, skip_footer=0, elif typ == XL_CELL_BOOLEAN: value = bool(value) elif convert_float and typ == XL_CELL_NUMBER: - # Excel 'numbers' are always floats + # GH5394 - Excel 'numbers' are always floats + # it's a minimal perf hit and less suprising val = int(value) if val == value: value = val diff --git a/pandas/io/tests/data/test_types.xls b/pandas/io/tests/data/test_types.xls index 420ea6daebaa02161fe7fb3bd08bf886cbd8cc16..2d387603a8307bc7b7050a36fc82cedc4fd5ceb3 100644 GIT binary patch delta 997 zcmaJ-Ur19?82`?8w%xnAKUZ7ZQu9uzhl+H;BqP~yIt#Z_nPlssmeVCEkp=b#y$d9Y z2%=9C27y)&)=ReQLqwwiIp6tyzw>ot|Z_6dSNs&?^O3CNm6RNyKAap5Vw_GT8I05zC12JE1S}+Bm5^IU$3BK9U+}g z=M`{5-1vn$_vaGw2)BC^hJ^Z0u;PgKa7mm1bQu5|V&}U8XL{MGQ(p1DFVc0_0W9Er z{bda$7zyl9w`5>}nDJPHv^fLC?2j}j#QA;T4=?$3fXfa0hy^{3&CLA4#&)-A{*cB9 zIyQYUc4Nsu4>kxfcj6F%5Crjiqt~KkLI4D`Y*H%M1g8nws4;z@nvxFmgzi_~IzHW( z%Dy35##2WVi^|?&&C6+qTL_+P!9tqR6q}1#&O0`2(!q6^Q@< delta 1017 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 prRM+9)FS`@ delta 13507 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