@@ -37,6 +37,11 @@ def tsframe():
37
37
return tm .makeTimeDataFrame ()[:5 ]
38
38
39
39
40
+ @pytest .fixture (params = [True , False ])
41
+ def merge_cells (request ):
42
+ return request .param
43
+
44
+
40
45
@contextlib .contextmanager
41
46
def ignore_xlrd_time_clock_warning ():
42
47
"""
@@ -1069,7 +1074,7 @@ def test_read_xlrd_book(self, ext, frame):
1069
1074
class _WriterBase :
1070
1075
1071
1076
@pytest .fixture (autouse = True )
1072
- def set_engine_and_path (self , request , merge_cells , engine , ext ):
1077
+ def set_engine_and_path (self , request , engine , ext ):
1073
1078
"""Fixture to set engine and open file for use in each test case
1074
1079
1075
1080
Rather than requiring `engine=...` to be provided explicitly as an
@@ -1095,7 +1100,6 @@ class and any subclasses, on account of the `autouse=True`
1095
1100
set_option (option_name , prev_engine ) # Roll back option change
1096
1101
1097
1102
1098
- @pytest .mark .parametrize ("merge_cells" , [True , False ])
1099
1103
@pytest .mark .parametrize ("engine,ext" , [
1100
1104
pytest .param ('openpyxl' , '.xlsx' , marks = pytest .mark .skipif (
1101
1105
not td .safe_import ('openpyxl' ), reason = 'No openpyxl' )),
@@ -1109,7 +1113,7 @@ class and any subclasses, on account of the `autouse=True`
1109
1113
class TestExcelWriter (_WriterBase ):
1110
1114
# Base class for test cases to run with different Excel writers.
1111
1115
1112
- def test_excel_sheet_size (self , merge_cells , engine , ext ):
1116
+ def test_excel_sheet_size (self , engine , ext ):
1113
1117
1114
1118
# GH 26080
1115
1119
breaking_row_count = 2 ** 20 + 1
@@ -1127,7 +1131,7 @@ def test_excel_sheet_size(self, merge_cells, engine, ext):
1127
1131
with pytest .raises (ValueError , match = msg ):
1128
1132
col_df .to_excel (self .path )
1129
1133
1130
- def test_excel_sheet_by_name_raise (self , merge_cells , engine , ext ):
1134
+ def test_excel_sheet_by_name_raise (self , engine , ext ):
1131
1135
import xlrd
1132
1136
1133
1137
gt = DataFrame (np .random .randn (10 , 2 ))
@@ -1141,8 +1145,7 @@ def test_excel_sheet_by_name_raise(self, merge_cells, engine, ext):
1141
1145
with pytest .raises (xlrd .XLRDError ):
1142
1146
pd .read_excel (xl , "0" )
1143
1147
1144
- def test_excel_writer_context_manager (
1145
- self , frame , merge_cells , engine , ext ):
1148
+ def test_excel_writer_context_manager (self , frame , engine , ext ):
1146
1149
with ExcelWriter (self .path ) as writer :
1147
1150
frame .to_excel (writer , "Data1" )
1148
1151
frame2 = frame .copy ()
@@ -1156,7 +1159,7 @@ def test_excel_writer_context_manager(
1156
1159
tm .assert_frame_equal (found_df , frame )
1157
1160
tm .assert_frame_equal (found_df2 , frame2 )
1158
1161
1159
- def test_roundtrip (self , merge_cells , engine , ext , frame ):
1162
+ def test_roundtrip (self , engine , ext , frame ):
1160
1163
frame = frame .copy ()
1161
1164
frame ['A' ][:5 ] = nan
1162
1165
@@ -1206,7 +1209,7 @@ def test_roundtrip(self, merge_cells, engine, ext, frame):
1206
1209
recons = pd .read_excel (self .path , index_col = 0 )
1207
1210
tm .assert_frame_equal (s .to_frame (), recons )
1208
1211
1209
- def test_mixed (self , merge_cells , engine , ext , frame ):
1212
+ def test_mixed (self , engine , ext , frame ):
1210
1213
mixed_frame = frame .copy ()
1211
1214
mixed_frame ['foo' ] = 'bar'
1212
1215
@@ -1215,7 +1218,7 @@ def test_mixed(self, merge_cells, engine, ext, frame):
1215
1218
recons = pd .read_excel (reader , 'test1' , index_col = 0 )
1216
1219
tm .assert_frame_equal (mixed_frame , recons )
1217
1220
1218
- def test_ts_frame (self , tsframe , merge_cells , engine , ext ):
1221
+ def test_ts_frame (self , tsframe , engine , ext ):
1219
1222
df = tsframe
1220
1223
1221
1224
df .to_excel (self .path , "test1" )
@@ -1224,7 +1227,7 @@ def test_ts_frame(self, tsframe, merge_cells, engine, ext):
1224
1227
recons = pd .read_excel (reader , "test1" , index_col = 0 )
1225
1228
tm .assert_frame_equal (df , recons )
1226
1229
1227
- def test_basics_with_nan (self , merge_cells , engine , ext , frame ):
1230
+ def test_basics_with_nan (self , engine , ext , frame ):
1228
1231
frame = frame .copy ()
1229
1232
frame ['A' ][:5 ] = nan
1230
1233
frame .to_excel (self .path , 'test1' )
@@ -1234,7 +1237,7 @@ def test_basics_with_nan(self, merge_cells, engine, ext, frame):
1234
1237
1235
1238
@pytest .mark .parametrize ("np_type" , [
1236
1239
np .int8 , np .int16 , np .int32 , np .int64 ])
1237
- def test_int_types (self , merge_cells , engine , ext , np_type ):
1240
+ def test_int_types (self , engine , ext , np_type ):
1238
1241
# Test np.int values read come back as int
1239
1242
# (rather than float which is Excel's format).
1240
1243
df = DataFrame (np .random .randint (- 10 , 10 , size = (10 , 2 )),
@@ -1260,7 +1263,7 @@ def test_int_types(self, merge_cells, engine, ext, np_type):
1260
1263
1261
1264
@pytest .mark .parametrize ("np_type" , [
1262
1265
np .float16 , np .float32 , np .float64 ])
1263
- def test_float_types (self , merge_cells , engine , ext , np_type ):
1266
+ def test_float_types (self , engine , ext , np_type ):
1264
1267
# Test np.float values read come back as float.
1265
1268
df = DataFrame (np .random .random_sample (10 ), dtype = np_type )
1266
1269
df .to_excel (self .path , "test1" )
@@ -1271,7 +1274,7 @@ def test_float_types(self, merge_cells, engine, ext, np_type):
1271
1274
tm .assert_frame_equal (df , recons , check_dtype = False )
1272
1275
1273
1276
@pytest .mark .parametrize ("np_type" , [np .bool8 , np .bool_ ])
1274
- def test_bool_types (self , merge_cells , engine , ext , np_type ):
1277
+ def test_bool_types (self , engine , ext , np_type ):
1275
1278
# Test np.bool values read come back as float.
1276
1279
df = (DataFrame ([1 , 0 , True , False ], dtype = np_type ))
1277
1280
df .to_excel (self .path , "test1" )
@@ -1281,7 +1284,7 @@ def test_bool_types(self, merge_cells, engine, ext, np_type):
1281
1284
1282
1285
tm .assert_frame_equal (df , recons )
1283
1286
1284
- def test_inf_roundtrip (self , merge_cells , engine , ext ):
1287
+ def test_inf_roundtrip (self , engine , ext ):
1285
1288
df = DataFrame ([(1 , np .inf ), (2 , 3 ), (5 , - np .inf )])
1286
1289
df .to_excel (self .path , "test1" )
1287
1290
@@ -1290,7 +1293,7 @@ def test_inf_roundtrip(self, merge_cells, engine, ext):
1290
1293
1291
1294
tm .assert_frame_equal (df , recons )
1292
1295
1293
- def test_sheets (self , merge_cells , engine , ext , frame , tsframe ):
1296
+ def test_sheets (self , engine , ext , frame , tsframe ):
1294
1297
frame = frame .copy ()
1295
1298
frame ['A' ][:5 ] = nan
1296
1299
@@ -1313,7 +1316,7 @@ def test_sheets(self, merge_cells, engine, ext, frame, tsframe):
1313
1316
assert 'test1' == reader .sheet_names [0 ]
1314
1317
assert 'test2' == reader .sheet_names [1 ]
1315
1318
1316
- def test_colaliases (self , merge_cells , engine , ext , frame ):
1319
+ def test_colaliases (self , engine , ext , frame ):
1317
1320
frame = frame .copy ()
1318
1321
frame ['A' ][:5 ] = nan
1319
1322
@@ -1409,7 +1412,7 @@ def test_excel_roundtrip_datetime(self, merge_cells, tsframe, engine, ext):
1409
1412
1410
1413
tm .assert_frame_equal (tsframe , recons )
1411
1414
1412
- def test_excel_date_datetime_format (self , merge_cells , engine , ext ):
1415
+ def test_excel_date_datetime_format (self , engine , ext ):
1413
1416
# see gh-4133
1414
1417
#
1415
1418
# Excel output format strings
@@ -1448,7 +1451,7 @@ def test_excel_date_datetime_format(self, merge_cells, engine, ext):
1448
1451
# we need to use df_expected to check the result.
1449
1452
tm .assert_frame_equal (rs2 , df_expected )
1450
1453
1451
- def test_to_excel_interval_no_labels (self , merge_cells , engine , ext ):
1454
+ def test_to_excel_interval_no_labels (self , engine , ext ):
1452
1455
# see gh-19242
1453
1456
#
1454
1457
# Test writing Interval without labels.
@@ -1465,7 +1468,7 @@ def test_to_excel_interval_no_labels(self, merge_cells, engine, ext):
1465
1468
recons = pd .read_excel (reader , "test1" , index_col = 0 )
1466
1469
tm .assert_frame_equal (expected , recons )
1467
1470
1468
- def test_to_excel_interval_labels (self , merge_cells , engine , ext ):
1471
+ def test_to_excel_interval_labels (self , engine , ext ):
1469
1472
# see gh-19242
1470
1473
#
1471
1474
# Test writing Interval with labels.
@@ -1483,7 +1486,7 @@ def test_to_excel_interval_labels(self, merge_cells, engine, ext):
1483
1486
recons = pd .read_excel (reader , "test1" , index_col = 0 )
1484
1487
tm .assert_frame_equal (expected , recons )
1485
1488
1486
- def test_to_excel_timedelta (self , merge_cells , engine , ext ):
1489
+ def test_to_excel_timedelta (self , engine , ext ):
1487
1490
# see gh-19242, gh-9155
1488
1491
#
1489
1492
# Test writing timedelta to xls.
@@ -1501,8 +1504,7 @@ def test_to_excel_timedelta(self, merge_cells, engine, ext):
1501
1504
recons = pd .read_excel (reader , "test1" , index_col = 0 )
1502
1505
tm .assert_frame_equal (expected , recons )
1503
1506
1504
- def test_to_excel_periodindex (
1505
- self , merge_cells , engine , ext , tsframe ):
1507
+ def test_to_excel_periodindex (self , engine , ext , tsframe ):
1506
1508
xp = tsframe .resample ('M' , kind = 'period' ).mean ()
1507
1509
1508
1510
xp .to_excel (self .path , 'sht1' )
@@ -1527,8 +1529,7 @@ def test_to_excel_multiindex(self, merge_cells, engine, ext, frame):
1527
1529
tm .assert_frame_equal (frame , df )
1528
1530
1529
1531
# GH13511
1530
- def test_to_excel_multiindex_nan_label (
1531
- self , merge_cells , engine , ext ):
1532
+ def test_to_excel_multiindex_nan_label (self , merge_cells , engine , ext ):
1532
1533
df = pd .DataFrame ({'A' : [None , 2 , 3 ],
1533
1534
'B' : [10 , 20 , 30 ],
1534
1535
'C' : np .random .sample (3 )})
@@ -1578,8 +1579,7 @@ def test_to_excel_multiindex_dates(
1578
1579
tm .assert_frame_equal (tsframe , recons )
1579
1580
assert recons .index .names == ('time' , 'foo' )
1580
1581
1581
- def test_to_excel_multiindex_no_write_index (self , merge_cells , engine ,
1582
- ext ):
1582
+ def test_to_excel_multiindex_no_write_index (self , engine , ext ):
1583
1583
# Test writing and re-reading a MI witout the index. GH 5616.
1584
1584
1585
1585
# Initial non-MI frame.
@@ -1600,7 +1600,7 @@ def test_to_excel_multiindex_no_write_index(self, merge_cells, engine,
1600
1600
# Test that it is the same as the initial frame.
1601
1601
tm .assert_frame_equal (frame1 , frame3 )
1602
1602
1603
- def test_to_excel_float_format (self , merge_cells , engine , ext ):
1603
+ def test_to_excel_float_format (self , engine , ext ):
1604
1604
df = DataFrame ([[0.123456 , 0.234567 , 0.567567 ],
1605
1605
[12.32112 , 123123.2 , 321321.2 ]],
1606
1606
index = ["A" , "B" ], columns = ["X" , "Y" , "Z" ])
@@ -1614,7 +1614,7 @@ def test_to_excel_float_format(self, merge_cells, engine, ext):
1614
1614
index = ["A" , "B" ], columns = ["X" , "Y" , "Z" ])
1615
1615
tm .assert_frame_equal (result , expected )
1616
1616
1617
- def test_to_excel_output_encoding (self , merge_cells , engine , ext ):
1617
+ def test_to_excel_output_encoding (self , engine , ext ):
1618
1618
# Avoid mixed inferred_type.
1619
1619
df = DataFrame ([["\u0192 " , "\u0193 " , "\u0194 " ],
1620
1620
["\u0195 " , "\u0196 " , "\u0197 " ]],
@@ -1627,7 +1627,7 @@ def test_to_excel_output_encoding(self, merge_cells, engine, ext):
1627
1627
encoding = "utf8" , index_col = 0 )
1628
1628
tm .assert_frame_equal (result , df )
1629
1629
1630
- def test_to_excel_unicode_filename (self , merge_cells , engine , ext ):
1630
+ def test_to_excel_unicode_filename (self , engine , ext ):
1631
1631
with ensure_clean ("\u0192 u." + ext ) as filename :
1632
1632
try :
1633
1633
f = open (filename , "wb" )
@@ -1649,7 +1649,7 @@ def test_to_excel_unicode_filename(self, merge_cells, engine, ext):
1649
1649
index = ["A" , "B" ], columns = ["X" , "Y" , "Z" ])
1650
1650
tm .assert_frame_equal (result , expected )
1651
1651
1652
- # def test_to_excel_header_styling_xls(self, merge_cells, engine, ext):
1652
+ # def test_to_excel_header_styling_xls(self, engine, ext):
1653
1653
1654
1654
# import StringIO
1655
1655
# s = StringIO(
@@ -1696,7 +1696,7 @@ def test_to_excel_unicode_filename(self, merge_cells, engine, ext):
1696
1696
# assert 1 == cell_xf.border.left_line_style
1697
1697
# assert 2 == cell_xf.alignment.hor_align
1698
1698
# os.remove(filename)
1699
- # def test_to_excel_header_styling_xlsx(self, merge_cells, engine, ext):
1699
+ # def test_to_excel_header_styling_xlsx(self, engine, ext):
1700
1700
# import StringIO
1701
1701
# s = StringIO(
1702
1702
# """Date,ticker,type,value
@@ -1799,7 +1799,7 @@ def roundtrip(data, header=True, parser_hdr=0, index=True):
1799
1799
for c in range (len (res .columns )):
1800
1800
assert res .iloc [r , c ] is not np .nan
1801
1801
1802
- def test_duplicated_columns (self , merge_cells , engine , ext ):
1802
+ def test_duplicated_columns (self , engine , ext ):
1803
1803
# see gh-5235
1804
1804
df = DataFrame ([[1 , 2 , 3 ], [1 , 2 , 3 ], [1 , 2 , 3 ]],
1805
1805
columns = ["A" , "B" , "B" ])
@@ -1838,7 +1838,7 @@ def test_duplicated_columns(self, merge_cells, engine, ext):
1838
1838
pd .read_excel (
1839
1839
self .path , "test1" , header = None , mangle_dupe_cols = False )
1840
1840
1841
- def test_swapped_columns (self , merge_cells , engine , ext ):
1841
+ def test_swapped_columns (self , engine , ext ):
1842
1842
# Test for issue #5427.
1843
1843
write_frame = DataFrame ({'A' : [1 , 1 , 1 ],
1844
1844
'B' : [2 , 2 , 2 ]})
@@ -1849,7 +1849,7 @@ def test_swapped_columns(self, merge_cells, engine, ext):
1849
1849
tm .assert_series_equal (write_frame ['A' ], read_frame ['A' ])
1850
1850
tm .assert_series_equal (write_frame ['B' ], read_frame ['B' ])
1851
1851
1852
- def test_invalid_columns (self , merge_cells , engine , ext ):
1852
+ def test_invalid_columns (self , engine , ext ):
1853
1853
# see gh-10982
1854
1854
write_frame = DataFrame ({"A" : [1 , 1 , 1 ],
1855
1855
"B" : [2 , 2 , 2 ]})
@@ -1865,7 +1865,7 @@ def test_invalid_columns(self, merge_cells, engine, ext):
1865
1865
with pytest .raises (KeyError ):
1866
1866
write_frame .to_excel (self .path , "test1" , columns = ["C" , "D" ])
1867
1867
1868
- def test_comment_arg (self , merge_cells , engine , ext ):
1868
+ def test_comment_arg (self , engine , ext ):
1869
1869
# see gh-18735
1870
1870
#
1871
1871
# Test the comment argument functionality to pd.read_excel.
@@ -1885,7 +1885,7 @@ def test_comment_arg(self, merge_cells, engine, ext):
1885
1885
result2 = pd .read_excel (self .path , "test_c" , comment = "#" , index_col = 0 )
1886
1886
tm .assert_frame_equal (result1 , result2 )
1887
1887
1888
- def test_comment_default (self , merge_cells , engine , ext ):
1888
+ def test_comment_default (self , engine , ext ):
1889
1889
# Re issue #18735
1890
1890
# Test the comment argument default to pd.read_excel
1891
1891
@@ -1899,7 +1899,7 @@ def test_comment_default(self, merge_cells, engine, ext):
1899
1899
result2 = pd .read_excel (self .path , 'test_c' , comment = None )
1900
1900
tm .assert_frame_equal (result1 , result2 )
1901
1901
1902
- def test_comment_used (self , merge_cells , engine , ext ):
1902
+ def test_comment_used (self , engine , ext ):
1903
1903
# see gh-18735
1904
1904
#
1905
1905
# Test the comment argument is working as expected when used.
@@ -1915,7 +1915,7 @@ def test_comment_used(self, merge_cells, engine, ext):
1915
1915
result = pd .read_excel (self .path , "test_c" , comment = "#" , index_col = 0 )
1916
1916
tm .assert_frame_equal (result , expected )
1917
1917
1918
- def test_comment_empty_line (self , merge_cells , engine , ext ):
1918
+ def test_comment_empty_line (self , engine , ext ):
1919
1919
# Re issue #18735
1920
1920
# Test that pd.read_excel ignores commented lines at the end of file
1921
1921
@@ -1927,7 +1927,7 @@ def test_comment_empty_line(self, merge_cells, engine, ext):
1927
1927
result = pd .read_excel (self .path , comment = '#' )
1928
1928
tm .assert_frame_equal (result , expected )
1929
1929
1930
- def test_datetimes (self , merge_cells , engine , ext ):
1930
+ def test_datetimes (self , engine , ext ):
1931
1931
1932
1932
# Test writing and reading datetimes. For issue #9139. (xref #9185)
1933
1933
datetimes = [datetime (2013 , 1 , 13 , 1 , 2 , 3 ),
@@ -1948,7 +1948,7 @@ def test_datetimes(self, merge_cells, engine, ext):
1948
1948
1949
1949
tm .assert_series_equal (write_frame ['A' ], read_frame ['A' ])
1950
1950
1951
- def test_bytes_io (self , merge_cells , engine , ext ):
1951
+ def test_bytes_io (self , engine , ext ):
1952
1952
# see gh-7074
1953
1953
bio = BytesIO ()
1954
1954
df = DataFrame (np .random .randn (10 , 2 ))
@@ -1962,7 +1962,7 @@ def test_bytes_io(self, merge_cells, engine, ext):
1962
1962
reread_df = pd .read_excel (bio , index_col = 0 )
1963
1963
tm .assert_frame_equal (df , reread_df )
1964
1964
1965
- def test_write_lists_dict (self , merge_cells , engine , ext ):
1965
+ def test_write_lists_dict (self , engine , ext ):
1966
1966
# see gh-8188.
1967
1967
df = DataFrame ({"mixed" : ["a" , ["b" , "c" ], {"d" : "e" , "f" : 2 }],
1968
1968
"numeric" : [1 , 2 , 3.0 ],
@@ -1976,7 +1976,7 @@ def test_write_lists_dict(self, merge_cells, engine, ext):
1976
1976
1977
1977
tm .assert_frame_equal (read , expected )
1978
1978
1979
- def test_true_and_false_value_options (self , merge_cells , engine , ext ):
1979
+ def test_true_and_false_value_options (self , engine , ext ):
1980
1980
# see gh-13347
1981
1981
df = pd .DataFrame ([["foo" , "bar" ]], columns = ["col1" , "col2" ])
1982
1982
expected = df .replace ({"foo" : True , "bar" : False })
@@ -1986,15 +1986,15 @@ def test_true_and_false_value_options(self, merge_cells, engine, ext):
1986
1986
false_values = ["bar" ], index_col = 0 )
1987
1987
tm .assert_frame_equal (read_frame , expected )
1988
1988
1989
- def test_freeze_panes (self , merge_cells , engine , ext ):
1989
+ def test_freeze_panes (self , engine , ext ):
1990
1990
# see gh-15160
1991
1991
expected = DataFrame ([[1 , 2 ], [3 , 4 ]], columns = ["col1" , "col2" ])
1992
1992
expected .to_excel (self .path , "Sheet1" , freeze_panes = (1 , 1 ))
1993
1993
1994
1994
result = pd .read_excel (self .path , index_col = 0 )
1995
1995
tm .assert_frame_equal (result , expected )
1996
1996
1997
- def test_path_path_lib (self , merge_cells , engine , ext ):
1997
+ def test_path_path_lib (self , engine , ext ):
1998
1998
df = tm .makeDataFrame ()
1999
1999
writer = partial (df .to_excel , engine = engine )
2000
2000
@@ -2003,7 +2003,7 @@ def test_path_path_lib(self, merge_cells, engine, ext):
2003
2003
path = "foo.{ext}" .format (ext = ext ))
2004
2004
tm .assert_frame_equal (result , df )
2005
2005
2006
- def test_path_local_path (self , merge_cells , engine , ext ):
2006
+ def test_path_local_path (self , engine , ext ):
2007
2007
df = tm .makeDataFrame ()
2008
2008
writer = partial (df .to_excel , engine = engine )
2009
2009
0 commit comments