From aca3e39a6c7f282e13e1eb910d32e0a63c2f7042 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Tue, 1 Sep 2015 21:02:23 +0200 Subject: [PATCH 1/8] TST: add missing test Excel file formats, rename test to test1 for clarity --- pandas/io/tests/data/{test.xls => test1.xls} | Bin .../io/tests/data/{test.xlsm => test1.xlsm} | Bin .../io/tests/data/{test.xlsx => test1.xlsx} | Bin pandas/io/tests/data/test2.xlsm | Bin 0 -> 8086 bytes pandas/io/tests/data/test2.xlsx | Bin 28216 -> 8067 bytes pandas/io/tests/data/test3.xlsm | Bin 0 -> 8063 bytes pandas/io/tests/data/test3.xlsx | Bin 0 -> 8045 bytes pandas/io/tests/data/test4.xls | Bin 0 -> 25600 bytes pandas/io/tests/data/test4.xlsm | Bin 0 -> 8022 bytes pandas/io/tests/data/test4.xlsx | Bin 0 -> 28216 bytes pandas/io/tests/data/test_converters.xlsm | Bin 0 -> 8467 bytes pandas/io/tests/data/test_multisheet.xls | Bin 0 -> 29696 bytes pandas/io/tests/data/test_multisheet.xlsm | Bin 0 -> 10852 bytes pandas/io/tests/data/test_types.xlsm | Bin 0 -> 8733 bytes pandas/io/tests/data/test_types_datetime.xls | Bin 0 -> 8704 bytes pandas/io/tests/data/times_1900.xlsm | Bin 0 -> 8282 bytes pandas/io/tests/data/times_1900.xlsx | Bin 0 -> 8266 bytes pandas/io/tests/data/times_1904.xlsm | Bin 0 -> 8260 bytes pandas/io/tests/data/times_1904.xlsx | Bin 0 -> 8244 bytes 19 files changed, 0 insertions(+), 0 deletions(-) rename pandas/io/tests/data/{test.xls => test1.xls} (100%) rename pandas/io/tests/data/{test.xlsm => test1.xlsm} (100%) rename pandas/io/tests/data/{test.xlsx => test1.xlsx} (100%) create mode 100644 pandas/io/tests/data/test2.xlsm create mode 100644 pandas/io/tests/data/test3.xlsm create mode 100644 pandas/io/tests/data/test3.xlsx create mode 100644 pandas/io/tests/data/test4.xls create mode 100644 pandas/io/tests/data/test4.xlsm create mode 100644 pandas/io/tests/data/test4.xlsx create mode 100644 pandas/io/tests/data/test_converters.xlsm create mode 100644 pandas/io/tests/data/test_multisheet.xls create mode 100644 pandas/io/tests/data/test_multisheet.xlsm create mode 100644 pandas/io/tests/data/test_types.xlsm create mode 100644 pandas/io/tests/data/test_types_datetime.xls create mode 100644 pandas/io/tests/data/times_1900.xlsm create mode 100644 pandas/io/tests/data/times_1900.xlsx create mode 100644 pandas/io/tests/data/times_1904.xlsm create mode 100644 pandas/io/tests/data/times_1904.xlsx diff --git a/pandas/io/tests/data/test.xls b/pandas/io/tests/data/test1.xls similarity index 100% rename from pandas/io/tests/data/test.xls rename to pandas/io/tests/data/test1.xls diff --git a/pandas/io/tests/data/test.xlsm b/pandas/io/tests/data/test1.xlsm similarity index 100% rename from pandas/io/tests/data/test.xlsm rename to pandas/io/tests/data/test1.xlsm diff --git a/pandas/io/tests/data/test.xlsx b/pandas/io/tests/data/test1.xlsx similarity index 100% rename from pandas/io/tests/data/test.xlsx rename to pandas/io/tests/data/test1.xlsx diff --git a/pandas/io/tests/data/test2.xlsm b/pandas/io/tests/data/test2.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..31cfba7ede0823740e16aad889b6b6c2b025049d GIT binary patch literal 8086 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/test2.xlsx b/pandas/io/tests/data/test2.xlsx index 441db5e55e666571a94e9966fe2b184bf702faab..94dd951e0bb84dd566dc9aa58c89067771f49a8d 100644 GIT binary patch delta 5630 zcmZu#WmFu?x*gnQa3{D1cXziCm;?zVKwyFsTn7p648b9|yGyV@a1RcH1qeF026^P1 z_0GBPuGfG1TeZJhtGjwv_1?RA86ilTR7V{NnFxRiKnDN-bO1AWCfEc40Enw0l|h8` zm6{u6efaR075*DvE{E7!xQ1YS*_-cV6kKa>*BBVq*QSdd88FbLZ$c@|{k{KysgsmE z;iI9!Q8p2!3@^Elb9l|u40u;3+5$C0beQ`D%oj%4sUY)Elk>@(MtwO|L)8|H6G68gf zQ}X~Fo5*^S3O@UB-(G3rJdNSwZ_i-AnbrxZdRHkeTC-x~EVRhz?Ksy8`m+=yv_*y4 z1O18y2Af5?v=7axeC!J+(KeA4uOEpnfxE3|U2^z?U384Tp@(Y&yW-vl6I(_>@ROun z2;T!LG#*TZ(V)-6aQ?Kg8g*Zhs1YIBJv`VUM=E!r16MP!ID9#EcUhG-Iz2ys)n&Yf z=sZSBSSJe=z8*yok}{;-?`~)bCK0_iKzF$zP##G@B+k(2UJ;Uf>*R{Y&ipY+$*Fw3 z7w9%~F>{%!tmet;)*j1V)?A#UKDf%D^y5UK27jFE6$J)i0aXZzWNLt6pQeq$irIA~ z!i?O@!-|mVCgJQo=y*D0E~#)AM>4-gDlxh40+ky9qN}Oi%Y)yJ^$^PAp6*5rTyWv0KhWRDLm#YXTVkf;_d8#uWN&@* zdRCnq$sxq^Xtdw$N)UGgiSVMEqd0;9*^AKjNF2ps^lTIf-R!V}CQuoLklver8N+OpZhDi>S;EIcstNv6#nto5vs{)DMHVeCsSm!ZEGkg@p*wECn@!SIzZk z+Z0$|9f|#`h$92v_E~cYQsXCG3X&Ca7Wh*#EK=0d%5bv6d3|3E_Clud#Qq_sASbFz;bQZ(>U7t8B@E5F&uH|^o#DYp{~rJ(Uv>w zH}u$m4^)aTNW&H1u;GE6@#d7gH;>VNKMuW$^?gIG7rNY?3^MF0+yM{2y52Gyyn-kF zj;IIW+=<#In;DX=LkiWTzUc*7{WgeCdQVlfP9H%^HP1hLqptcG=*}gENXExwA$kp| zjjw9W>PU9{*y(YYw0ZZ;^_>>^cMMOj?Ju{7Xa?8pd6PagYd6(bG@Ci6DiA7cu^OxS zd$KiYFLf90$0B*a z7+Rj&q#(Z{?WRvfP8Z2!JW~`%WpNT{(X!9g^r~rDDF5N`*wpgkcg|cF?LYhkG=@as?x(Rm>%)}RE z_)Ahtb`GPlfVb{PzEVCvzHVe^rHC@tR##fOEFQ~)4`0*Zl62^o*1 z6ej8*y_LpxcE7W+wB2;&xLnXP9#-aC8 zftJ18)#O@h3!e&j2^`b4hJO-K2f)1q?qhu=iZ-6VS5gZFiMQ6#`^#23GknjqXslc1IG z2pr!AKctJ~t6}jdJR9o~7q4oH=`$bho$>~WARx{1J3z3v;SP0=v%XLvnG&?j$d z*AoY+N(RU@xK7c!fd;v76kQ^=__h;6ymHzuo0mk%trLe+c90;i@tR&}%P0wc+@vVj&(VXUGm;dSbTK*kkprYL#m0uZ_0-m&R}glmCBU?b0zm%2&Urz$~J zDO}nD3+6?5=-Zi@XWU4#Q8D7Ise9C>KED^f zm_iQjPBzm?V>_yUw!}PMglhZU+&GKlGaGrV-z3LEyl<~>UVV9ZfH7cwh2|nrOEL0p zkLmjyEWhO)(e&)Lh{2nJ%$k$YnVri3=NnVtkplpeH_xnlTx)i}8nK~A;dprZ^{=(k z7C6gtGMI*&Awin^$qs9$_xw3Na*p=&c=9#iWsSKm<9v#-H4kOwm0S8UE@KcrYC-lc zXxlY{AfQmB`&<0@JY8SX0*tx$c%O#6AgV6h(Vnm3m3kw^wS)YwfbZGwkhFeA z(U*(b;jNDlt?9Z_7sF|Bwwew@@uGYmLbx>RnxuesrMZXIEY`gEy) zy3B3fE)1JmAmYvZ(AUK|tr>eyRhi3s7RLH+4FXrJ@V;7L?y)=L^vGDS;_$azwoz{R zhNz7pVi`MP;@8rm)qB=$9m$!MBW;a4a0u-adKpQstqWS>l zR^5qSQTsMoSm=)$U|ItVmNhNEE2}gPgyNiLyN%(Mas6`9_0-n9Q_pWUXRtO|f!h%HQm|tIbtTbr@^q z?SfS@LWc6B;=_qzLzS<8c(SrRsS+m_|3yGSc~}`9&&=XB9uF?UWDDsuYK2!BWuoE5 zSoY>c>!>aVc58tNzK~at$&Rp5(Cgv?Q(|f#2fdi^oLLd_jN|kiF=2$ zvzK!mq9m_*3y3_XQZ6cm-SztnSC1)e#M_W~S3P|_@OM5R3zF5%BgksOEHz5oD*raV z3~Ty&yYpxuz7ae%|58m@qx*{?r7Cr?rLwI#Sw(p#BT9IWqZ;ED<`p`Y!2?!U{&tOB zpzd&pSjSdin|Ww(JSS7j){ zE7n&k3KJsD9b(#ZIJVbVMDw?!d(X&lv67qdtw1#_fDnn`JrPSi1Wby}P;;bpVu9Mw z-Mfd4cK&m+?}IytyNKJnpma>sU%IhSHf@wLYJ5STrmLbK5FDSTMbYAqS)dGfeeSoS zsh|uLl_Cqd<=^YKpw2F-X_bcBIC$d_PgDu_H`PxHs5Slj#Ie#!`!%cBk+>J?J~C93 zezLbzG&g=$*LAC?2vB~RY`fv$pL@ce5bDH?)$ng|MWh$rIE}r?CLk{Rz_HwOV->=E z$^tq8^;uPML+(`DaOrzUZ^qo&({9NQ*5I5`q#4D65(v;2hfWV}awX|#J{ zRf$l)yON z=78H!#(@&T&C}WK@xNJ$N#5Z(^5oDnkN^O(e|?2B`2BkqXYRjlynhHA1^vrlgd8DV z(jvobMB%MmA&0qkI_04V@>fpD?-xnv!?W@kM>}clxRoZ%WbAWQCAn{=*x@D>@4Sy? z^EhtURYj4CswXQsZmPa$zcLlUdeN#x0ddheWkB|O<$I??HQ^wShffYPX7!}~8HWYb z!vlpNqd6vim^311JI_Q9LR-*CE(aQ<`H_IE`>o{Q-0$8lS))+uiDPk%;o~VO?Ma_| zp|hmvC$E*CFTorOCU8F$H%y+0$comnL*P_i29#;PT`yEi3B55_)+<0XNR7O7kc<>c zU+FW$a+LVe+)06Mu=v?T(w*ODX$xb$@0;TeIH8VimM>*W-mmfzf5Np2K!!>2Y}!jKHWX9Cf?AhUWQ$K!$izrwl!aO|UUoF~M>!Gh>|kZM(gl9FHofqBMUf zjOItKpAp`*e)T>m4bg3A+whOja2&$nDbnP%5@!oUyN8n!O9TZ>wPMF&AM&YN!lsUV zpDW5PQ$3`JUfsC28s3{fL!?c-Y|t7S-gN6Q%%%@lrRe*hQpk}oQI^>Eqe-YQ_D0A9 z@`AeOE#O4gN>E5z2t*yY^h$IyNj-qjWx<6E|l;J4AB#KOeRs2Cbw&4sHx zRF3Oh58aJ;fshE5^C@%ulyNH#bMU_ zPGY&(m(^N|c~ng0CPK{ewn(~(<5C@Okz`ms2%^5zWk9TpYHm1x1wBJ)`nK{GSvA_I zcPb9Wr&O4I3KI6~FjB=^$Dl=4-^3S`s7HV z2xt^gT3dXo{|;*Y?L0zqGEx1v zu=uy=aOZdkS1k04BiyY4#!2AM}3!Jg!N$ literal 28216 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�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 diff --git a/pandas/io/tests/data/test3.xlsm b/pandas/io/tests/data/test3.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..54b7ef456a9ea6040c73d3d8dba5b8607217909c GIT binary patch literal 8063 zcmeHM1zQ}+)*jqtaQEOr2bbV(K_)?h1b24}5L|;MSg-*S+}#N-f#5Jmf(8u|9KOlk z-MhQle81ps_0wH5-F?o}Rp&iYZ)qqaAQAwO0jK}~fEGYo-stTJ2LSjW0s!~`RCs-9 zM+Y}^2R9>aZzprtXB=Mkb~Jg2@XR>?c-Z^@w*TQ7C`}$#>*2zcJy*DqUVj(`t(HLL z+lL>*V|^^%S;wTR-LdYhe08oe84gGxnsPX<-pbx}E=S4lOSeM;+8(0MY>A}?X&KHs z7*?L|xCV^#s7zX0w}u3l!OdHF`SZOlM=+L~#>N0c2&i64=mez<_ygqWA@N{FpIBF5 zf!=^n#G>J$8uKAuV{#EV1Peu7V+f)+-z6sU3h zFi6W>0Hs8D6>Hx3Gfgh#C1quqFJz`yPn!P~cbkGTzl>>bczpDmbBq9k0(WcfaJith zr*I4okf?yY^$|eq;KDuy6|H*;bF=nV!-^= z$i>{wm6PMg^<3ccK?Z!%T5;~Y=O(C{G?VMJnYg7o@Sb(f!Cl*3I+ zY3-MVRW=CZd`%k92%JqV+`)PjA*8Z5`G#=7^||GIx!-^t?b#)nj+T{>b>;JH7hyVY zBQv|s6Pb(-{9C_=YMBF?bRfJ7o^kp92RUbfdbOZ$!&%5MWbf@7HX;b_0dIUn|C1pKou zw&Ex}L?3*+LlGp$(UVaG)aUzURKfB{_;`C?cT4s$u+v@fo5T|b*s}=)H!qkUkcQ_M z(#f1QO@@JN#<<*hY+OH54#6-pT)Y0_>ZR6RS#WJb15G-M#m0S;^x}8qx53`j6DOo- zilSKFfQjuXTDFTW+3%>wtv42`-eb01`B#`56eY@3@A<_1!rW-W2jr;(SrT10^4_%Q z9Im-ZT@SHzEFQBDpB`GQ5B5*5z%2bw$cO_Gw}oMFc>}9|aA0r1AoEwSlxnLwE^=YE z;mif%x~Z>^gV3H6t7e$Mh2?Hne=i+yW0y%4RdmqAygtm|_uidR4&Q&SiFc;bE^p)R zT~6qYxLYtmid6*nASaZiK-}!~7I|VoY(R=d>JKl^dD7qrW-^WUHH|}rs~xu5 z@UJl&iA1+KC@h4FWr9@koj2B^Y?5KLIuX98AdC(+?z7?Gqr^@9&PP(n4tYUNzd%+? zEy2!w!0rEJurJoC&I`+6bic};v3m+jY7dfl_YMV8Ks3BBNj`jzJ}e%-6A^QOv8{)0 zo5^xZkUN*K9_`cfB6Ll|rJWTLd>!P`ov}$@(bB=JMBo{qrGO(VXW0m1y0Gu5A8k%S zSMOnngdaM7tGT47DKV(O;mO>M8Xsg$A^Vs(QuY}O4%iiER?c_*2<7^I=t;c)Gg9sF zrLHuvUT5L9)$o&xjpu{s2dURlwP36pA-lBadL(OwO5)wxA(q#=uTsq^iq`0&h$-fH zXD*c$?}I%#gyBhexXgqu0;^wDG-tP`Ik|Lr?WeBa(72nZk$yn)_St-UwU45E!J0qe zN40ucc}}&Sd#n&hfhk;NId@C4`p8Gwjq|?90VI{#FyhwV4 zVC*!=IyuZAG4mE>>x59xOwZ!f_BG-Y;x4*3h#7)e3@5UnH%!i;CN+mVRiCP+`O;60 z_YF;tk2WsE-E_fAS6LgMBPxa{lWh+w=fi`!)U}_Fq{lWKAN~?%2GKGm8L%g{u#*6G z!eHiVW#VFPrsd{h?O^HpBQSwRCDFUNa6{MHRw=vp_O*%W5(_Z8@TU-7dejD4X!2@J zERqv*JfezU@i+u!5EDkeq1?+L!u*!dKY)YMaMvsn1jG^z6XF%RNRZfSAZN=f4A7-e zc|T10I4n{#fswPZ`x8Bt)L-kH%a2NNCa@H7b-0Ei>|v1a&fFm6`n_U4?wUAcdZWlwiJnp}XOo%rez zrmN?Tt%V)uH)LNs%f&rL+TDWn;yUyA>hxEngDu>&8i}U48tJKq=xt{j3&?oe4{mMi zRjsuKIzBRu&e4}`IHWt!Jk;&s$-g{3-Dwk8NdggbLSx^#zSL5CI_XhD%vv6j1SC%~ zTkvqiMu8OWIt3+i=dpL$dj>W6T3_FubL2e)u91j*e6*%tye}s;Qa@xa9&FLeSxKt4 zI{y;Fjpvl1HvENvG6ecM)iy;*BMzu&z$D52x{d!$0?;FDvY@36v|QwrfyzNH2ZE** zR!vBo^oQ$2u3}J4P69)+5YE!h zhecv=Y;8u|d@9MNPW(8xOZV6Sgu9Ia`P8Q&DPl+x`M?p-m%PQ(mNJL&@hURrmfE=k zKA*GqL9=_avx1&}m%K;l$@AwkM z@$@te=Ue~#<9Yn8jhcQYoa}7Ti=Fkgo+Ok<7WFZ4BFt~TQX2VP&%ZSa+`IXc@vRRot&-)rqMEk4lq>f-Xr+q*j`Jw|I%9s;E}1NY{bj^EyrG53h7 zcb8cl&Sc<>DGBZKQwiW){p*A10f6B%8k-*Xs-0GS7StFlFYkc<)n;mlt0X(UQRH)k z#(t9h>Zz|U*j(60dwRTi>Tt5h+?TLk#@U&MGjmHVz8#m)jT|*2F$vjpkHQNo6zuAL zH9kk%mpTt+>^<70B89}%L^?U(7ez-*Kah4YX3(6l4)4WH3yr0Dxo|YP{IF=a*nURL z&x~#@RANdhAmZIx->?;jh8?ev4EHo;d$f!heN%^mym0wAl8jFji|du?NK@H(9l>S^ z(k*&KwAh}n8!%%)J3%^Q^jYugxV@?#E~#%LLvI*f#ofN3mWra=62|AhpyFM@^~Q0Q z80>Rep_@ZJpOatsrK(*|q^Q6T|KJhxsu)PU+|zTD!*kwUScG z0!c4Z!+>O8L`BZ>lTKpXOHkiQsy9Es!4_RH)}lEk_S#r2eNMH{g(8vEI4m=nTOdo^1{86g$yFq3X!>ig6_yJM6XP_`d!z zxU3=p+=ACD#Y!k~XyFJsHk+f|LHMI7351uP@3}UrOQ>1iQw%Ktvt*eon44c)Iz7l^ z6aMP3fw0fVqIy_3OqOjeQ?K~~DM171Wn zw0dUy&OM=chSgba+CMZn=P?^HZ?R(EE)P4Oh$G*-tS`Y5Co+{?jwNI!XT7`NfNf7< zTl1i&X}ud0*QRrps4o7j%|=nRBTl53&9 zgdJZ(`5v+Bqz81YPq!((+wuGgi94Jv@$b;vako9st&CtUznZs9gUghkkiGjRTUX)# zA~H?hfmn{6gZC^5QW{Z$!!^CIiNl2rH_=2qg};#O3!1 zG29l=54kRPE$B2XqVkdK&_#c5^7J@3s$j(~h0L&Q<{Md-#mer|cp5j?iHf+3(FWmx~~ce0Kob^A-j3ong5oF3$*neGq?x>-qzk5UuKb64J4u#r($SA z9MY%M7D^BptG;4XtESm41RioHynO$Ozl`%Dv*(*K(WR@M(!ATyLmEi1g6xDw16Yi+Kh!MOSdZwkIE38-|v z)gxD=EVhuhGbJf2?O;HP>~T_J*g!u=#n8ROh$z^svJciA4ij$Q2yQVA4}HZ>+#mwM zf}-d6L@?Hhns^Sec?~M(mz6^aJAuz;Tg@tT#|AS2n%OgYLeWZ4R+Kt;D{7N(#iyP+ z7e>o-z8mjugR+YO$}bhOQ}wJuD729y+=*l#?23W4kIL4T%L)^tO&#Ofa@jUlnS=^9 zV|!0XurbmaaV^1BOn@-a(653P+HmM(>*1ydYlNWc@SU5x&uzS?Bp(L1;dkIScfc9w z$XlB6Ni6C}C6u^)ehueEpRoKI7KDmjvcZ`LwRzn|lOdT%3Pom8OV?{x;Eqo5DTTV~ zgoFAau9$b6-HI<|kgNK43F9Bh?N+T|Mq{5T`$Tkz5RGv~3#Ie3I6)@(~XmzH6i$4uaF;6BR=&Kt!RY`Pxe%P~*Z z^ed9R)dThz;>=<`(Vj;F!#F2rg%KgTjhRSEwyB6GW=+_MgEmcu#3x+XPdenHzlZVd zW`~G|e$aagH*6JV7EW-;S&tc?oE;#LFX21lPo>@yuSkIW!JPyti6slEX2%_mK#`!L zC~1R{B@uYOe%~lh8<}_a@MJwH^h+XIxmugByOmuiW6)JN!@xWI_2Ze%@n7P#wMqr6 z7q(orMgRav{)5*a>l9Zjb8|OWSS<^$fdLIwObjTHoTiqx=Dfrw4!Ecy#rsOXW`=)N% zz0}!mveHMm>u}Sk)W6iNJky(hGA_Km(bend)r=w*^NI|gHIlRC1Uop7P-E9FsTi#} z=`nvwKYqUZWTr{t$p*7h)V+W8yD5Vf2z)Toq_f?z5`{HL7AKdZb@cwI__bGpmt%Xx zzR|#k5c4HP>?7SP$(BycQ^ikwmI1&lO9J^!3&^aQL^OBavzk}sppQ4+-&1R-xXTCk zPBxgV?|x}{+4sZksxZrY!=e=sMrxQjnrgT>I=OP1I=Yzu&d>kLWx%E`CecW_hl}9D z3Q~vkpl?QDjkMHaP@I?$ZdTyYLq<>iDn)6$+5N?gdi^q$uKxAR>tUfZvzoTjU`i7G z8CH3QsKDuH;DmgHryw>CPM&g>3aq6Jy%6UIbDc@a5Q8nN z-ONG~{dS~5yLHN;=-mZ{&6^3kN{gEidjONO=m$Is{1NUYcxf@*2_VbGi>bGTUjf0U z#S+0TL`e~=jui;>`xOXTJT60%l(mO$F(MWi%h4gej>BDZAk`_AW)ks7T@}ME{pB`K z-+Mfv(0GNW)&#d{qct*LPS7QNdq7Mm8WJ?rj2Vx)&% zm_en_75LXHbKyQ0SgID9=2kOAl)l=VRj+^5yW{aSmYUO0jNt)QeA%dQgjFlsoL_1U zX6E-4=kVbDA!<(}-LL`!NU5hrB|eRBGWDYf)l)b+(oS|=LH4K81Vown4mmo4%Jyl( zb@63+$$bdt?)IS4)&To1V8{3g3bs7_6G?Ysjxakn1GiJdPeZ%eIOiKI48|<&p~kV` z_wq0FyrAl8lm`L)-RI@gP>Tx=#gk_fe(_WABC<}4|e4`r=x z$=rYrkUVow*<_uTx9uO>krU=B$v4{FXyWeHj#&97nddLTy|39^kqf-Py%^lM8D_sv zF8ZWq6KvE`bA#~*gyG;H!q}EyZ*~4*vOoG?Yp#BuLgiYA52&tbn{LK6OsR4xfOBU#7 z1wR+ve=4}Z`_Cu*w*>!L^ym8LPtjt+{|@~h)zHsc{+>(!)BynG5d#4K$gDq$|2+); hRh$tKGS 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 Qun@23h}=Cx_2bk30jZ|Q(f|Me literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/test4.xls b/pandas/io/tests/data/test4.xls new file mode 100644 index 0000000000000000000000000000000000000000..0e6f4331e2547d9a68e395c0317badcba0f48287 GIT binary patch literal 25600 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/test4.xlsm b/pandas/io/tests/data/test4.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..52328c7b28be9a536316e718745ebbf5baeaaa0d GIT binary patch literal 8022 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�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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/test_converters.xlsm b/pandas/io/tests/data/test_converters.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..eaf0b1d0219c56b646556c52b931bf78c74fc8c0 GIT binary patch literal 8467 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 GyZ-^HamEe+ literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/test_types.xlsm b/pandas/io/tests/data/test_types.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..c66fdc82dfb672286c0e1215c1a3a42c3af3b277 GIT binary patch literal 8733 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 o{uW<+g5p+w8L0 zM-$s|q?41}`|dsW+6W>iW`MK_oDbva!{tB(8ny(?e+}&c^#=bC2AH6td%JK`o%9z zvIWmRc>tcBILt)Eq%S*>nd$jrBJ}S?GsQn;f%mc%$J6bf<3l3%xaDWlPjSnuz5lwn zTI3CscG=3@(AW{_^#8A*LCMgeQHCKLGAq&2WEZgcaztTIsCuOofdUW^|1#Ck zWJC`r*|)2@Le=@GHTj8}^LvH4Mdrx!n34F(4jy7)-P`W8~ukDzZW+3Q#~7!c3x=NA)bl9$pK&OfWO%RpOY0&zbknVNfuc0jN$V#@dFn9 zIQ$b9p4T4*8S9M0Kj}cf&jG*R0YB(~Kj45r=zu@ufIsYjKjMHt>VQAyfPcyXe|#K% zrwc}mNrKOUn693MF^_r{#SHblA?8)j;+Q*epUU=+Aa|UxPo;I6!r}f~zJ+tB8h^u@ z4@G4Cc1_-vPce7I*DBw6;-!3o9rrDBKzg}Va^pNNP9pvImh!k9sZ!&|af*jqtrKdBxG29r9Am=u1+lmGRY=}l9R%?AvF9-2v6zu2^ z+dWXQ2Rt|sw`L3btD}9r9sLmV;zd;F&!akb4psD`A=*Lz9+`)80r&Dffq7u|tBbFk ze=d-KTKUrHD?x!&Hk8;;7jNp;iC%EkiJpgP8(}4$frZL41)r^Izen`<4QWGU@1sOdMa)GI7=`+tqw2Q###c^&%%?MT^zb(4%}-&xIZ( zvwFJBWcb-V13gM(jk#r(dR4S~9)uPpV2`VnfUk%S3(+H`^8Mxa|L)Mz>8m_wYv3?j z;c@j!kQ=w^T+Jg3fYos+J6C^jaB%Q%b=Fvsn6tzbDc}CrryqakxudJ<8|;-0DU((} zXxrIbV+?ZWGn*@52!e=wRND58-_2v8qp_=nHctp z$0J@$)W{b9U`WNdU5-3uiaH#Cwu9dY1T2YjC5XvGsN6%kwUnE)2(cs)mWp_x6J)g2ayhF-;pxW`^)gSd z=t}sV$HOZ(7Cy6-UeT5C^j4-1T^+hzX%R^tt((van7;l_QKX zeQMtxwWmOnr9SGDo7Bg+wm#gvCF++m>Vv>TFSR|&fU&j*$gn-e!jtF|cyVweJY7%) zI|h8p(bo}2cV1ZZ!tk^PTc#Wd!Vp8|jTE~EBnAR<_w!Aqa;n=Vfu=bs6cInr6tUzL z(>JCm^Wcq?Kw^)+I5g(D6<(-`&18q1``Vf^A@Fdp_KQbp`n{K{-ppOBArX{evZJOn zjR%^|mDR4FKXBXV$vO*T;7I(1TzEF}T`R&okh6?pN^$S3`Y}1bmV1?)%;F9^o?C;d zs)XmhN-N%Ra>C#$VUbOSM<|sSa#qT#pMUwMe@^^e$;qR!N_PD7hnqSf=a+FPdm-mM zS+$d!vgnu@ej(b` z?{C`H8IJgue{9kEjt${RB&@=up{J|M`q@oQnS6!#vzShPs+w^Hd5KrbOkiA(Jo2M| zynENCf&<_2$-?=^UuE|6VSu@w<6BWUa~ldTNDrfM59~nUKG=oAy|533r^Js@m=}jo zxGzqjFeAQ#!f#<`QFz|PQOM&G3fF(@vbslFnH+syipZbve%q9L$r6zOp0US%^X+y# z*-kcc{%4auRhB zqK!*&-!g|yWGd;GFi-)SG=g(4a=~4Y;d2&p5;ggA50W=wqEpw{gc|rpBs|e++?uY)p(xJZnt-)8oF69$q`tda+3XC%>u=z7zPE>!|Ynh#a r+!6$bP9;NFeSw^uJj?zI{h7o2omHCj$YkxG{{3yz%(6^)Km7j#hG4kX literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/times_1900.xlsm b/pandas/io/tests/data/times_1900.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..1ffdbe223453b103b4a67c138c3eb0109b9b4863 GIT binary patch literal 8282 zcmeHMgqa|L^)A{sLvmgQ{KJI5H6V8>tPBsKsh=)Q5-g zU+`Ep9(U9+sc3)Na8-grl*hvXDMXV_C)L|o`>quzdA)BPkZ|q652m-pQUkS2W}Hka zA-nE=BfQGvc6P17LFI6>w%)HErdJ@C$xdOR>lP4Dg^23}ru4r8$k7$V>oWSpy5r^> z_6tSKn}AiB!FY|yMY_S5C~E3o3KV7=b4SRTa51V6T=}Z32$jRko-^PJ5waEetDkTL zYFRx(DHUG9oHbjc$)&uatSo<7Fx_n^C6LI|Ca)wQZP^_jAN>Y`?q{6uX~z>T8@Q?u zNAFY+<#(|06%acxcSu16^h{xHHoC{|2Oo~SGMIi)tEZ%-vQ0uOzZhxIHJ{=!!sJUo zXMnSK?u-8JD;iB<9bD`8=a1eO^{2$-ENkXt7%z0_9a=uNZDAZk$uE<>^e6T*w=F#t zm&DP+ycVQ@&R$4=nVoeE7Z@NrgR9?Bjay}cLG1n>0igajp4RDb)1ARalwmYPhw;?Z z&C0=@i}T0*KYsoXlkzW9FH2HU>*B@;1Iyop_d})@6L2JzUP#Ed0JZ%B6c(`SV)N+9 z7e6sk;AoQtBgpx;`Q3b(Ulfhq>jz$}@s~y85s1*$zbFq&gSvX6urj)(%DR@VcH??Y zoljl7ky8XQd$q;0mNpjWDh({t$xa+gSK*9s>XD)07f^%|iM{T&Xvbd~(o08Nz zEDx(}c$BmEdL+YtCbe)E^GSq|^1=8U!hUxPo7oEAeh1+B6`78ft&m-%MV6Z|Ey(nl zL&vFf#wYw+Uk=sGeob0_yi48@xju%RbAQ8H{^P-SpzcR#U8Vis2ZExhiz^bE ze4Lzi3i~3>Fp`h~P~p5CxPIly3uiZb3ukBhAK~nG&cMN98qCZ8_En~-qSVce(}sQ* z&ix|8ix79#gNyb+XCE7Npq6Ex5ya?*JA-avnMzLO``RET;;RL&C>9*xN5XM8|sTj^Fe+sh>TIKyd4lnSnGsuaH*y ztZ6)q|M@VtC+~CjQOYkc%na6U1VBTy4$6aS8yaZdvRH54H%ZN3AZG`GsK-u8(G)~6 zL4dKHNg&(hXPFDslhzw+70|H#=R7FJCPk?d)rW^-zF{6T;r(*d{wzuEoA2MW=zv!} zB(J})e40ODA3OtFZw&NJEyGs&pO6{ot$cb2gTWF40Duj90tT7Cf+hd8iu3#rP9a=S zBQDy{#^JNe9$4%Pu&3qjG+&g-d$3DWXVE_z_(bhE^0dKN_`o6x?^fPd!Kp$`_BGRY z2_d5~b_EtVwoGj=(=jk4`{R-Z9&JOCy-n_W8`QIAziVrEkGo3uBXJxvDVceamZT~g zLvB&}3WR8;*wZjMkK3%!VT80?qzKs>Q5C(fE>^qJ%(wO=6?Vx1@v3LY4w*Dm{PCAJ zqaQfG^3$0F^DR(Aj}!$bfEGoyQQNqRk+_>)&hNHGV(qf4H;3JpSq|hKM2Dhi)mTci zm0b5DL&6}!OP09SqR3k^Ss%mXmG|1>Ryg8a)*YlV{Y&mY`NSS%Oq+Z5Q{L>Ppg2TH z)cXXRaw@i?H;C5fLwv@$%v$=Tg>mu9vuLVtW}O()RBH6uYdqWa-OaePx6>GIQ5Ks> z5Y37^&c4{)HjtfL@9d%=^?f&*`OHuxXH_7g%g^N^J6w~-QOOgxK9-kMB~z!j3k8AE zi(iqmHFJ({df%hp2%>op*+x=|tju#$lEy8VHAp4092azkE`M>L|N0570!i1G+tSP= z$JVl2^zFIYzapbrG~6-+Hc|`w6a0z{cUyBet7lpsZgx&K?mzYt{vnA6o!mH~t8FWk zod<{7#I#BI=%4W?5kkCb1Fbdrw8rMii8-H8#V>n-`7?+KBi~RSWDsE-C-n7Wqcq$# ziv;3giiQdC30)?LZ#R&$y)X1LpiurWNU9MQshPmY)$Q4|ofM>-ity@oJ0dtQ)!1i~EJ+g)lv39OTrIvSMp2Xy)(xh&7$+oC zE=FzW=ZKHh?i7eSixD^?(2H~JPBf~F6^fhWO1Uv45)sZv2Hy1`J49Z)3T9@<^DUIl zP(8z-!~?R7WN4hbF-X$KUj=L_@HJ2Dn;1qXXbV!C^}3J8^h(Rl2rT)7Sxxj<22g{p znvDB~m~}qrn;ItZU|53Q5Yva-NOAI(t(3~ABEwS$F2rzf=&_b6krskN+%f~d&36G~ z(e~^T$9ko`!#~d$D~RFnRehAfcMkiEh4q09*jGJ-DBN8}`dJvkZ;}pMJA@?l0Tq8< z)Kz4vKn3UOxf`Aq`j+r%^Hx!&o+=3id&WbV@oY}R!)Y?T`oa^;fD({#(S+TL4_YAP zfOQhD=bo-s)6Mo%)6#_q)zsTo4Q%I%LwzDAdRrb&wT9(Bd6PX49@1P_351)LmQ4$! ziM7HR_`bq2wRfzaFQr-vVE6OHT5cQHFTe6eP$V6~-Wr|DU36l3^?=l^o-*VkoNu{i zrwwyNn4QNiLzt*uv;{{Oq-h6U9D!7qU+%ea0x%93H7~f29!00UlBq;e%&ym*LU>u~ zZ@;Cb!WBP*=Cw7Ot3Qlsr;-qZ#G%ax#mSe&+L$^8n~M2InTYwj-F%-t?#hm%78CZn z%uCr+S?C3=srp_W+W7n3@<7*jA8}FpolJ7#G$U>-MV9HD5j-mck{B%%FpSoj66Ym2w_ypmFqN zZwp(1p=8H?-gQ>RbqNUznf{gRTTln(ut9Wm4xH0Y9R)f>7KCSF9Amsd)f=8$H!lb= zo+l;jD8Z>dt#>Z!)^bl7~m3;1wg#4Du*QV%&HIzdF8yR(* zw?&*62p|A3YK&74c!>q!llDh>vf`WD0@hq>y7r)Ll)_glFbLRTqQm{Z>DhVfOHl)4 z46_ROE=DzCdnc@EL!f_)STeJm*esT!ngnH}2*{nBdn~aT?Q$;(zucMUn9sPH8Tpn9ba_WDh2ER5KcB zL*uQYS61-?hbZV9p%EWEp7bCkU+PQ*F;)}2lh<}ZOZh}9FvKkcoUd&lc<^$fWZDzk z@{N>5T^EX%ch8|tk%jX1+jKwg>d`17m+2neiq=I7ozf}Enk%DHvMCG}AEOK>QeVMO z4@oi&@%N|@r||SagcTUIN28eLvdD8s_3_z_GF-26Ig?nZ62|3xmQNplAY)Rou)>pt zquy;lC7>26eOUXgLI03l)h(@*L*Hqwt>Jh)e>MxGuzeWm@vJE$lU+`3s93|aLXNpt zhL21#1CzQ2zLnFnB+>x>g-#Woz=4{IHGT!3vp}c0L1+fPJ){ZqrKmb;NqwcVqiwpJ z6>8;z@dJ|Ew0*Pb=(&K{vqz&AR+vGn&J*wlJ1wag;q$|(IA0I9sq+bn#2F;6B{_LUsq)Tts!*wU zaxa(F%Zhz7Qh!m?bn4ube}m-MgSmb`t9u55CnjJ+I1D6lN=1?tHqF2#X5H+Nlu=x- z2(W+HMTx`VB8CwUEMD=OzaidGzi$w-u}ZHEd#rUhhKTlHJ5dn{*dngP2vx<^Zfhc!k~vtAVzz8(K;k9FZrRhL?|<<)BZ|1!}0M?w@_v8y`W#Jj+#Y^;mOVWxqJJP#hIlV3{f?@s^iakIMR=>pHe4TkG zSc>+Fy3!x#=IC-szVCV5Is}427d4%xj27^?Kt@<MLBeaF25Cuj}td# zIRj1E;1KYTBYnsez6mrbXm|-ET;j>`iP>rtwiH=M5-mzeG8C{zb_sMKGfYfl*Za&0 z$fw1p2ba`z}qCm!!=4Ox#wm1BAGhAOFov_C?fOC9?Y$)i#lOteFg8 zoR<0*+&wi^3QGC+F|iE2>hC=XNFy90@EAyJ^`B%K3Yv5npK)^@rR=nI7BQf#Ln1xHa&et|+>iv}m$39(aYGXbJXk~=^VDqsm(&KC^?AK>x^p%?)M)Lfm-aE~saLIZtT;*)Rr z8!flY7rwR)Lg`BE`t&R(nV|Hs!Tqp)@S%TgWsOwaR&ba-oarRX+n3AE(_r2C4Bm^h zRiE9FkMe6Dlg_8rwldDWj4C<>7jDv9k?)U*8Xut>QVwYit@Nl%RY^rch)s`FVzSyZ zd~?J$+oOnAujwD$p0LK;T)}hQZmzK&57I|9L|;J}Sze<-HkKRZ%yDFHgY5^HN^&!~ zS%=$%U)b)2G6r5{&<43P1r1V59>a36f7T>>RyP%8Fu13n001Pv!u>~0;%;kY<>Ait zOY=*{mYg#0l*f$|2G*N{^AUg+LwC6EJaPtHHI1((Ik{ z^*q{Few3Q!V$0!Bza7d#reUZd@y;0K^poZuA!YU|6MT}ji@1V`VH3Wo^h6GCFxj1m zI&z4=1;JJA2`0nDQMB z6N;_M2~u|g$ZTvafjTP;$2~nh8ob`ji4$dhcZRO@{)|a_~F-n1cmgmT6ma5rqe~- zCpNXjK58N9xV^k&@u>-HHaVw;ByA%kr094%kyZQSY(?o)lU>r8s0tLa9(xVgMI>?? zg0FqriI$s828RV>i^GpmAhPkNiQbj zM!FAAf(YEsjgETdSYoe<*ZQp(DIe9FWhB#A%=nPXR)ujFtV)z3*AkkE$|Z$WGRl$L zlLu9qlNXnuWlA=0D(=2DgiP8ms9z||1gvvsu92~CPHHZ|-CEPXM@Xu{o%P-QfZ`IC z8$_1>Q1AimOjVyhI*o_Y&!Du6waebS?kMZqbYhCmT48+DFDA3t}PF?Mo95v<2Os_w#6|+-<{vB zU+^Fcx{Q$0NyV&hJ#2cHhOXUho(whL>r)`@qsLV6IbWI;Yyrn$1w+lY{MWj%nf&-U z@`=saw~3f?+=V7Sufi8~<&jn&rd-Zj9 z7`{>(5V4PNE&*o_;aW=dK!TAzZWwDTHy~XnQ&M`CY_#ea*^8D5=|AeFW4_{5Z!ilh zaEuu&)=?{^V(&4|xgNA{A?TqF=3dc$|7iA&c+A6Zh1O-SB)>pke2xDGkHb0;W+#~H z4sP|zK6m4Hado1AXT%{I#(fbdy7JN5lDAE&H4{G`10NhxLwQ-qx9z*0a+R+)yZ?;= zKaM@~LpG=A+N-%9a;fjF!>74(^^8(OTrP$XyBsIb>sf5z{&a}g372)Z83}# ze>rUW+3@d@`(F)*V9EObFTnro=Vu-EFP_l;q00Vj{IgW|r!g6^;cukc5~^0VpB>E55F$%KDQ{U6ES&tCo>QvdV;0C>T2 r$bSUbpUwZi2maL@5hfY_VgB2WsIG(rTU`L)0qhq5i{agrKYITMgTg*> literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/times_1900.xlsx b/pandas/io/tests/data/times_1900.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3702289b256fd0768b7edb235c423b0a9f14b15c GIT binary patch literal 8266 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/times_1904.xlsx b/pandas/io/tests/data/times_1904.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1a13468e59d1c51d7414a2a33e35994207be491f GIT binary patch literal 8244 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 R1psi7R}eCYXVU(7`VUT^90~vc literal 0 HcmV?d00001 From 8a74d5061dfc9be136ffb97ea3ca09841e9980a1 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Tue, 1 Sep 2015 21:15:25 +0200 Subject: [PATCH 2/8] TST: refactor Excel reader tests for easy integration of additional readers --- pandas/io/tests/test_excel.py | 508 +++++++++++++++++----------------- 1 file changed, 247 insertions(+), 261 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index 83db59f9d9029..dc0d5570a9f8f 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -76,11 +76,6 @@ def _skip_if_no_excelsuite(): class SharedItems(object): def setUp(self): self.dirpath = tm.get_data_path() - self.csv1 = os.path.join(self.dirpath, 'test1.csv') - self.csv2 = os.path.join(self.dirpath, 'test2.csv') - self.xls1 = os.path.join(self.dirpath, 'test.xls') - self.xlsx1 = os.path.join(self.dirpath, 'test.xlsx') - self.multisheet = os.path.join(self.dirpath, 'test_multisheet.xlsx') self.frame = _frame.copy() self.frame2 = _frame2.copy() self.tsframe = _tsframe.copy() @@ -91,266 +86,173 @@ def read_csv(self, *args, **kwds): kwds['engine'] = 'python' return read_csv(*args, **kwds) + def get_data(self, basename, csv=True): + """ + Return a DataFrame as read by the Python csv engine and a DataFrame + as read by the ExcelFile engine. Test data path is defined by + pandas.util.testing.get_data_path() + + Parameters + ---------- + + basename : str + File base name, excluding file extension. + + csv : boolean, default=True + When True, basename.csv is returned + """ + + excel = ExcelFile(os.path.join(self.dirpath, basename + self.ext)) + if csv: + # the reference is obtained form read_csv with Python engine + pref = os.path.join(self.dirpath, basename + '.csv') + dfref = self.read_csv(pref, index_col=0, parse_dates=True) + return dfref, excel + else: + return excel + + +class ReadingTestsBase(SharedItems): + # This is based on ExcelWriterBase + # + # Base class for test cases to run with different Excel readers. + # To add a reader test, define the following: + # 1. A check_skip function that skips your tests if your reader isn't + # installed. + # 2. Add a property ext, which is the file extension that your reader + # reades from. (needs to start with '.' so it's a valid path) + # 3. Add a property engine_name, which is the name of the reader class. + # For the reader this is not used for anything at the moment. + + def setUp(self): + self.check_skip() + super(ReadingTestsBase, self).setUp() -class ExcelReaderTests(SharedItems, tm.TestCase): def test_parse_cols_int(self): - _skip_if_no_openpyxl() - _skip_if_no_xlrd() - suffix = ['xls', 'xlsx', 'xlsm'] - - for s in suffix: - pth = os.path.join(self.dirpath, 'test.%s' % s) - xls = ExcelFile(pth) - df = xls.parse('Sheet1', index_col=0, parse_dates=True, - parse_cols=3) - df2 = self.read_csv(self.csv1, index_col=0, parse_dates=True) - df2 = df2.reindex(columns=['A', 'B', 'C']) - df3 = xls.parse('Sheet2', skiprows=[1], index_col=0, - parse_dates=True, parse_cols=3) - # TODO add index to xls file) - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) + dfref, excel = self.get_data('test1') + dfref = dfref.reindex(columns=['A', 'B', 'C']) + df1 = excel.parse('Sheet1', index_col=0, parse_dates=True, + parse_cols=3) + df2 = excel.parse('Sheet2', skiprows=[1], index_col=0, + parse_dates=True, parse_cols=3) + # TODO add index to xls file) + tm.assert_frame_equal(df1, dfref, check_names=False) + tm.assert_frame_equal(df2, dfref, check_names=False) def test_parse_cols_list(self): - _skip_if_no_openpyxl() - _skip_if_no_xlrd() - suffix = ['xls', 'xlsx', 'xlsm'] - - for s in suffix: - pth = os.path.join(self.dirpath, 'test.%s' % s) - xls = ExcelFile(pth) - df = xls.parse('Sheet1', index_col=0, parse_dates=True, - parse_cols=[0, 2, 3]) - df2 = self.read_csv(self.csv1, index_col=0, parse_dates=True) - df2 = df2.reindex(columns=['B', 'C']) - df3 = xls.parse('Sheet2', skiprows=[1], index_col=0, - parse_dates=True, - parse_cols=[0, 2, 3]) - # TODO add index to xls file) - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) + dfref, excel = self.get_data('test1') + dfref = dfref.reindex(columns=['B', 'C']) + df1 = excel.parse('Sheet1', index_col=0, parse_dates=True, + parse_cols=[0, 2, 3]) + df2 = excel.parse('Sheet2', skiprows=[1], index_col=0, + parse_dates=True, + parse_cols=[0, 2, 3]) + # TODO add index to xls file) + tm.assert_frame_equal(df1, dfref, check_names=False) + tm.assert_frame_equal(df2, dfref, check_names=False) def test_parse_cols_str(self): - _skip_if_no_openpyxl() - _skip_if_no_xlrd() - suffix = ['xls', 'xlsx', 'xlsm'] - - for s in suffix: - - pth = os.path.join(self.dirpath, 'test.%s' % s) - xls = ExcelFile(pth) - - df = xls.parse('Sheet1', index_col=0, parse_dates=True, - parse_cols='A:D') - df2 = read_csv(self.csv1, index_col=0, parse_dates=True) - df2 = df2.reindex(columns=['A', 'B', 'C']) - df3 = xls.parse('Sheet2', skiprows=[1], index_col=0, - parse_dates=True, parse_cols='A:D') - # TODO add index to xls, read xls ignores index name ? - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) - del df, df2, df3 - - df = xls.parse('Sheet1', index_col=0, parse_dates=True, - parse_cols='A,C,D') - df2 = read_csv(self.csv1, index_col=0, parse_dates=True) - df2 = df2.reindex(columns=['B', 'C']) - df3 = xls.parse('Sheet2', skiprows=[1], index_col=0, - parse_dates=True, - parse_cols='A,C,D') - # TODO add index to xls file - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) - del df, df2, df3 - - df = xls.parse('Sheet1', index_col=0, parse_dates=True, - parse_cols='A,C:D') - df2 = read_csv(self.csv1, index_col=0, parse_dates=True) - df2 = df2.reindex(columns=['B', 'C']) - df3 = xls.parse('Sheet2', skiprows=[1], index_col=0, - parse_dates=True, - parse_cols='A,C:D') - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) + dfref, excel = self.get_data('test1') + + df1 = dfref.reindex(columns=['A', 'B', 'C']) + df2 = excel.parse('Sheet1', index_col=0, parse_dates=True, + parse_cols='A:D') + df3 = excel.parse('Sheet2', skiprows=[1], index_col=0, + parse_dates=True, parse_cols='A:D') + # TODO add index to xls, read xls ignores index name ? + tm.assert_frame_equal(df2, df1, check_names=False) + tm.assert_frame_equal(df3, df1, check_names=False) + + df1 = dfref.reindex(columns=['B', 'C']) + df2 = excel.parse('Sheet1', index_col=0, parse_dates=True, + parse_cols='A,C,D') + df3 = excel.parse('Sheet2', skiprows=[1], index_col=0, + parse_dates=True, + parse_cols='A,C,D') + # TODO add index to xls file + tm.assert_frame_equal(df2, df1, check_names=False) + tm.assert_frame_equal(df3, df1, check_names=False) + + df1 = dfref.reindex(columns=['B', 'C']) + df2 = excel.parse('Sheet1', index_col=0, parse_dates=True, + parse_cols='A,C:D') + df3 = excel.parse('Sheet2', skiprows=[1], index_col=0, + parse_dates=True, + parse_cols='A,C:D') + tm.assert_frame_equal(df2, df1, check_names=False) + tm.assert_frame_equal(df3, df1, check_names=False) def test_excel_stop_iterator(self): - _skip_if_no_xlrd() - excel_data = ExcelFile(os.path.join(self.dirpath, 'test2.xls')) - parsed = excel_data.parse('Sheet1') + excel = self.get_data('test2', csv=False) + + parsed = excel.parse('Sheet1') expected = DataFrame([['aaaa', 'bbbbb']], columns=['Test', 'Test1']) tm.assert_frame_equal(parsed, expected) def test_excel_cell_error_na(self): - _skip_if_no_xlrd() - excel_data = ExcelFile(os.path.join(self.dirpath, 'test3.xls')) - parsed = excel_data.parse('Sheet1') + excel = self.get_data('test3', csv=False) + + parsed = excel.parse('Sheet1') expected = DataFrame([[np.nan]], columns=['Test']) tm.assert_frame_equal(parsed, expected) def test_excel_passes_na(self): - _skip_if_no_xlrd() - excel_data = ExcelFile(os.path.join(self.dirpath, 'test2.xlsx')) - parsed = excel_data.parse('Sheet1', keep_default_na=False, - na_values=['apple']) + excel = self.get_data('test4', csv=False) + + parsed = excel.parse('Sheet1', keep_default_na=False, + na_values=['apple']) expected = DataFrame([['NA'], [1], ['NA'], [np.nan], ['rabbit']], columns=['Test']) tm.assert_frame_equal(parsed, expected) - parsed = excel_data.parse('Sheet1', keep_default_na=True, - na_values=['apple']) + parsed = excel.parse('Sheet1', keep_default_na=True, + na_values=['apple']) expected = DataFrame([[np.nan], [1], [np.nan], [np.nan], ['rabbit']], columns=['Test']) tm.assert_frame_equal(parsed, expected) - def check_excel_table_sheet_by_index(self, filename, csvfile): - import xlrd - - pth = os.path.join(self.dirpath, filename) - xls = ExcelFile(pth) - df = xls.parse(0, index_col=0, parse_dates=True) - df2 = self.read_csv(csvfile, index_col=0, parse_dates=True) - df3 = xls.parse(1, skiprows=[1], index_col=0, parse_dates=True) - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) - - df4 = xls.parse(0, index_col=0, parse_dates=True, skipfooter=1) - df5 = xls.parse(0, index_col=0, parse_dates=True, skip_footer=1) - tm.assert_frame_equal(df4, df.ix[:-1]) - tm.assert_frame_equal(df4, df5) - - self.assertRaises(xlrd.XLRDError, xls.parse, 'asdf') - def test_excel_table_sheet_by_index(self): - _skip_if_no_xlrd() - for filename, csvfile in [(self.xls1, self.csv1), - (self.xlsx1, self.csv1)]: - self.check_excel_table_sheet_by_index(filename, csvfile) - def test_excel_table(self): - _skip_if_no_xlrd() + dfref, excel = self.get_data('test1') - pth = os.path.join(self.dirpath, 'test.xls') - xls = ExcelFile(pth) - df = xls.parse('Sheet1', index_col=0, parse_dates=True) - df2 = self.read_csv(self.csv1, index_col=0, parse_dates=True) - df3 = xls.parse('Sheet2', skiprows=[1], index_col=0, parse_dates=True) - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) - - df4 = xls.parse('Sheet1', index_col=0, parse_dates=True, - skipfooter=1) - df5 = xls.parse('Sheet1', index_col=0, parse_dates=True, - skip_footer=1) - tm.assert_frame_equal(df4, df.ix[:-1]) - tm.assert_frame_equal(df4, df5) + df1 = excel.parse(0, index_col=0, parse_dates=True) + df2 = excel.parse(1, skiprows=[1], index_col=0, parse_dates=True) + tm.assert_frame_equal(df1, dfref, check_names=False) + tm.assert_frame_equal(df2, dfref, check_names=False) - def test_excel_read_buffer(self): - _skip_if_no_xlrd() - _skip_if_no_openpyxl() - - pth = os.path.join(self.dirpath, 'test.xls') - f = open(pth, 'rb') - xls = ExcelFile(f) - # it works - xls.parse('Sheet1', index_col=0, parse_dates=True) - - pth = os.path.join(self.dirpath, 'test.xlsx') - f = open(pth, 'rb') - xl = ExcelFile(f) - xl.parse('Sheet1', index_col=0, parse_dates=True) - - def test_read_xlrd_Book(self): - _skip_if_no_xlrd() - _skip_if_no_xlwt() + df3 = excel.parse(0, index_col=0, parse_dates=True, skipfooter=1) + df4 = excel.parse(0, index_col=0, parse_dates=True, skip_footer=1) + tm.assert_frame_equal(df3, df1.ix[:-1]) + tm.assert_frame_equal(df3, df4) import xlrd + self.assertRaises(xlrd.XLRDError, excel.parse, 'asdf') - df = self.frame - - with ensure_clean('.xls') as pth: - df.to_excel(pth, "SheetA") - book = xlrd.open_workbook(pth) - - with ExcelFile(book, engine="xlrd") as xl: - result = xl.parse("SheetA") - tm.assert_frame_equal(df, result) - - result = read_excel(book, sheetname="SheetA", engine="xlrd") - tm.assert_frame_equal(df, result) - - @tm.network - def test_read_from_http_url(self): - _skip_if_no_xlrd() - - url = ('https://raw.github.com/pydata/pandas/master/' - 'pandas/io/tests/data/test.xlsx') - url_table = read_excel(url) - dirpath = tm.get_data_path() - localtable = os.path.join(dirpath, 'test.xlsx') - local_table = read_excel(localtable) - tm.assert_frame_equal(url_table, local_table) - - @slow - def test_read_from_file_url(self): - _skip_if_no_xlrd() - - # FILE - if sys.version_info[:2] < (2, 6): - raise nose.SkipTest("file:// not supported with Python < 2.6") - dirpath = tm.get_data_path() - localtable = os.path.join(dirpath, 'test.xlsx') - local_table = read_excel(localtable) - - try: - url_table = read_excel('file://localhost/' + localtable) - except URLError: - # fails on some systems - raise nose.SkipTest("failing on %s" % - ' '.join(platform.uname()).strip()) - - tm.assert_frame_equal(url_table, local_table) - - def test_xlsx_table(self): - _skip_if_no_xlrd() - _skip_if_no_openpyxl() - - pth = os.path.join(self.dirpath, 'test.xlsx') - xlsx = ExcelFile(pth) - df = xlsx.parse('Sheet1', index_col=0, parse_dates=True) - df2 = self.read_csv(self.csv1, index_col=0, parse_dates=True) - df3 = xlsx.parse('Sheet2', skiprows=[1], index_col=0, parse_dates=True) - - # TODO add index to xlsx file - tm.assert_frame_equal(df, df2, check_names=False) - tm.assert_frame_equal(df3, df2, check_names=False) - - df4 = xlsx.parse('Sheet1', index_col=0, parse_dates=True, - skipfooter=1) - df5 = xlsx.parse('Sheet1', index_col=0, parse_dates=True, - skip_footer=1) - tm.assert_frame_equal(df4, df.ix[:-1]) - tm.assert_frame_equal(df4, df5) + def test_excel_table(self): - def test_reader_closes_file(self): - _skip_if_no_xlrd() - _skip_if_no_openpyxl() + dfref, excel = self.get_data('test1') - pth = os.path.join(self.dirpath, 'test.xlsx') - f = open(pth, 'rb') - with ExcelFile(f) as xlsx: - # parses okay - xlsx.parse('Sheet1', index_col=0) + df1 = excel.parse('Sheet1', index_col=0, parse_dates=True) + df2 = excel.parse('Sheet2', skiprows=[1], index_col=0, + parse_dates=True) + # TODO add index to file + tm.assert_frame_equal(df1, dfref, check_names=False) + tm.assert_frame_equal(df2, dfref, check_names=False) - self.assertTrue(f.closed) + df3 = excel.parse('Sheet1', index_col=0, parse_dates=True, + skipfooter=1) + df4 = excel.parse('Sheet1', index_col=0, parse_dates=True, + skip_footer=1) + tm.assert_frame_equal(df3, df1.ix[:-1]) + tm.assert_frame_equal(df3, df4) def test_reader_special_dtypes(self): - _skip_if_no_xlrd() expected = DataFrame.from_items([ ("IntCol", [1, 2, -3, 4, 0]), @@ -364,44 +266,40 @@ def test_reader_special_dtypes(self): datetime(2015, 3, 14)]) ]) - xlsx_path = os.path.join(self.dirpath, 'test_types.xlsx') - xls_path = os.path.join(self.dirpath, 'test_types.xls') + pth = os.path.join(self.dirpath, 'test_types' + self.ext) # 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) + actual = read_excel(pth, '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) float_expected.loc[1, "Str2Col"] = 3.0 - for path in (xls_path, xlsx_path): - actual = read_excel(path, 'Sheet1', convert_float=False) - tm.assert_frame_equal(actual, float_expected) + actual = read_excel(pth, '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) + actual = read_excel(pth, 'Sheet1', index_col=icol) 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}) + actual = read_excel(pth, '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}, + actual = read_excel(pth, 'Sheet1', converters={"StrCol": str}, convert_float=False) tm.assert_frame_equal(actual, no_convert_float) # GH8212 - support for converters and missing values def test_reader_converters(self): - _skip_if_no_xlrd() + + pth = os.path.join(self.dirpath, 'test_converters' + self.ext) expected = DataFrame.from_items([ ("IntCol", [1, 2, -3, -1000, 0]), @@ -416,48 +314,114 @@ def test_reader_converters(self): 3: lambda x: str(x) if x else '', } - xlsx_path = os.path.join(self.dirpath, 'test_converters.xlsx') - xls_path = os.path.join(self.dirpath, 'test_converters.xls') - # should read in correctly and set types of single cells (not array dtypes) - for path in (xls_path, xlsx_path): - actual = read_excel(path, 'Sheet1', converters=converters) - tm.assert_frame_equal(actual, expected) + actual = read_excel(pth, 'Sheet1', converters=converters) + tm.assert_frame_equal(actual, expected) def test_reading_all_sheets(self): # Test reading all sheetnames by setting sheetname to None, # Ensure a dict is returned. # See PR #9450 - - _skip_if_no_xlrd() - - dfs = read_excel(self.multisheet,sheetname=None) - expected_keys = ['Alpha','Beta','Charlie'] - tm.assert_contains_all(expected_keys,dfs.keys()) + pth = os.path.join(self.dirpath, 'test_multisheet' + self.ext) + dfs = read_excel(pth, sheetname=None) + expected_keys = ['Alpha', 'Beta', 'Charlie'] + tm.assert_contains_all(expected_keys, dfs.keys()) def test_reading_multiple_specific_sheets(self): # Test reading specific sheetnames by specifying a mixed list # of integers and strings, and confirm that duplicated sheet # references (positions/names) are removed properly. - # Ensure a dict is returned # See PR #9450 - _skip_if_no_xlrd() - - #Explicitly request duplicates. Only the set should be returned. - expected_keys = [2,'Charlie','Charlie'] - dfs = read_excel(self.multisheet,sheetname=expected_keys) + pth = os.path.join(self.dirpath, 'test_multisheet' + self.ext) + # Explicitly request duplicates. Only the set should be returned. + expected_keys = [2, 'Charlie', 'Charlie'] + dfs = read_excel(pth, sheetname=expected_keys) expected_keys = list(set(expected_keys)) - tm.assert_contains_all(expected_keys,dfs.keys()) + tm.assert_contains_all(expected_keys, dfs.keys()) assert len(expected_keys) == len(dfs.keys()) + +class XlrdTests(ReadingTestsBase): + """ + This is the base class for the xlrd tests, and 3 different file formats + are supported: xls, xlsx, xlsm + """ + + def test_excel_read_buffer(self): + + pth = os.path.join(self.dirpath, 'test1' + self.ext) + f = open(pth, 'rb') + xls = ExcelFile(f) + # it works + xls.parse('Sheet1', index_col=0, parse_dates=True) + + def test_read_xlrd_Book(self): + _skip_if_no_xlwt() + + import xlrd + df = self.frame + with ensure_clean('.xls') as pth: + df.to_excel(pth, "SheetA") + book = xlrd.open_workbook(pth) + + with ExcelFile(book, engine="xlrd") as xl: + result = xl.parse("SheetA") + tm.assert_frame_equal(df, result) + + result = read_excel(book, sheetname="SheetA", engine="xlrd") + tm.assert_frame_equal(df, result) + + @tm.network + def test_read_from_http_url(self): + # TODO: remove this when merging into master + url = ('https://raw.github.com/davidovitch/pandas/master/' + 'pandas/io/tests/data/test1' + self.ext) +# url = ('https://raw.github.com/pydata/pandas/master/' +# 'pandas/io/tests/data/test' + self.ext) + url_table = read_excel(url) + dirpath = tm.get_data_path() + localtable = os.path.join(dirpath, 'test1' + self.ext) + local_table = read_excel(localtable) + tm.assert_frame_equal(url_table, local_table) + + @slow + def test_read_from_file_url(self): + + # FILE + if sys.version_info[:2] < (2, 6): + raise nose.SkipTest("file:// not supported with Python < 2.6") + dirpath = tm.get_data_path() + localtable = os.path.join(dirpath, 'test1' + self.ext) + local_table = read_excel(localtable) + + try: + url_table = read_excel('file://localhost/' + localtable) + except URLError: + # fails on some systems + import platform + raise nose.SkipTest("failing on %s" % + ' '.join(platform.uname()).strip()) + + tm.assert_frame_equal(url_table, local_table) + + def test_reader_closes_file(self): + + pth = os.path.join(self.dirpath, 'test1' + self.ext) + f = open(pth, 'rb') + with ExcelFile(f) as xlsx: + # parses okay + xlsx.parse('Sheet1', index_col=0) + + self.assertTrue(f.closed) + def test_creating_and_reading_multiple_sheets(self): # Test reading multiple sheets, from a runtime created excel file # with multiple sheets. # See PR #9450 - _skip_if_no_xlrd() _skip_if_no_xlwt() + _skip_if_no_openpyxl() def tdf(sheetname): d, i = [11,22,33], [1,2,3] @@ -468,7 +432,7 @@ def tdf(sheetname): dfs = [tdf(s) for s in sheets] dfs = dict(zip(sheets,dfs)) - with ensure_clean('.xlsx') as pth: + with ensure_clean(self.ext) as pth: with ExcelWriter(pth) as ew: for sheetname, df in iteritems(dfs): df.to_excel(ew,sheetname) @@ -478,7 +442,6 @@ def tdf(sheetname): def test_reader_seconds(self): # Test reading times with and without milliseconds. GH5945. - _skip_if_no_xlrd() import xlrd if LooseVersion(xlrd.__VERSION__) >= LooseVersion("0.9.3"): @@ -510,8 +473,8 @@ def test_reader_seconds(self): time(16, 37, 1), time(18, 20, 54)])]) - epoch_1900 = os.path.join(self.dirpath, 'times_1900.xls') - epoch_1904 = os.path.join(self.dirpath, 'times_1904.xls') + epoch_1900 = os.path.join(self.dirpath, 'times_1900' + self.ext) + epoch_1904 = os.path.join(self.dirpath, 'times_1904' + self.ext) actual = read_excel(epoch_1900, 'Sheet1') tm.assert_frame_equal(actual, expected) @@ -543,6 +506,24 @@ def test_read_excel_blank_with_header(self): actual = read_excel(blank, 'Sheet1') tm.assert_frame_equal(actual, expected) +class XlsReaderTests(XlrdTests, tm.TestCase): + ext = '.xls' + engine_name = 'xlrd' + check_skip = staticmethod(_skip_if_no_xlrd) + + +class XlsxReaderTests(XlrdTests, tm.TestCase): + ext = '.xlsx' + engine_name = 'xlrd' + check_skip = staticmethod(_skip_if_no_xlrd) + + +class XlsmReaderTests(XlrdTests, tm.TestCase): + ext = '.xlsm' + engine_name = 'xlrd' + check_skip = staticmethod(_skip_if_no_xlrd) + + class ExcelWriterBase(SharedItems): # Base class for test cases to run with different Excel writers. # To add a writer test, define the following: @@ -1269,6 +1250,8 @@ def test_datetimes(self): # GH7074 def test_bytes_io(self): + _skip_if_no_xlrd() + bio = BytesIO() df = DataFrame(np.random.randn(10, 2)) writer = ExcelWriter(bio) @@ -1280,6 +1263,8 @@ def test_bytes_io(self): # GH8188 def test_write_lists_dict(self): + _skip_if_no_xlrd() + df = pd.DataFrame({'mixed': ['a', ['b', 'c'], {'d': 'e', 'f': 2}], 'numeric': [1, 2, 3.0], 'str': ['apple', 'banana', 'cherry']}) @@ -1291,6 +1276,7 @@ def test_write_lists_dict(self): read = read_excel(path, 'Sheet1', header=0) tm.assert_frame_equal(read, expected) + def raise_wrapper(major_ver): def versioned_raise_wrapper(orig_method): @functools.wraps(orig_method) From 2e055d3d389785b7d39e9f172a3a1db999f6dd20 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Sat, 5 Sep 2015 12:14:57 +0200 Subject: [PATCH 3/8] split get_data into a get_excel and get_csv_refdf methods --- pandas/io/tests/test_excel.py | 65 +++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index dc0d5570a9f8f..36a96962dab3e 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -81,15 +81,29 @@ def setUp(self): self.tsframe = _tsframe.copy() self.mixed_frame = _mixed_frame.copy() - def read_csv(self, *args, **kwds): - kwds = kwds.copy() - kwds['engine'] = 'python' - return read_csv(*args, **kwds) + def get_csv_refdf(self, basename): + """ + Obtain the reference data from read_csv with the Python engine. + Test data path is defined by pandas.util.testing.get_data_path() + + Parameters + ---------- + + basename : str + File base name, excluding file extension. - def get_data(self, basename, csv=True): + Returns + ------- + + dfref : DataFrame + """ + pref = os.path.join(self.dirpath, basename + '.csv') + dfref = read_csv(pref, index_col=0, parse_dates=True, engine='python') + return dfref + + def get_excel(self, basename): """ - Return a DataFrame as read by the Python csv engine and a DataFrame - as read by the ExcelFile engine. Test data path is defined by + Return test data ExcelFile instance. Test data path is defined by pandas.util.testing.get_data_path() Parameters @@ -98,18 +112,12 @@ def get_data(self, basename, csv=True): basename : str File base name, excluding file extension. - csv : boolean, default=True - When True, basename.csv is returned - """ + Returns + ------- - excel = ExcelFile(os.path.join(self.dirpath, basename + self.ext)) - if csv: - # the reference is obtained form read_csv with Python engine - pref = os.path.join(self.dirpath, basename + '.csv') - dfref = self.read_csv(pref, index_col=0, parse_dates=True) - return dfref, excel - else: - return excel + excel : io.excel.ExcelFile + """ + return ExcelFile(os.path.join(self.dirpath, basename + self.ext)) class ReadingTestsBase(SharedItems): @@ -130,7 +138,8 @@ def setUp(self): def test_parse_cols_int(self): - dfref, excel = self.get_data('test1') + dfref = self.get_csv_refdf('test1') + excel = self.get_excel('test1') dfref = dfref.reindex(columns=['A', 'B', 'C']) df1 = excel.parse('Sheet1', index_col=0, parse_dates=True, parse_cols=3) @@ -142,7 +151,8 @@ def test_parse_cols_int(self): def test_parse_cols_list(self): - dfref, excel = self.get_data('test1') + excel = self.get_excel('test1') + dfref = self.get_csv_refdf('test1') dfref = dfref.reindex(columns=['B', 'C']) df1 = excel.parse('Sheet1', index_col=0, parse_dates=True, parse_cols=[0, 2, 3]) @@ -155,7 +165,8 @@ def test_parse_cols_list(self): def test_parse_cols_str(self): - dfref, excel = self.get_data('test1') + excel = self.get_excel('test1') + dfref = self.get_csv_refdf('test1') df1 = dfref.reindex(columns=['A', 'B', 'C']) df2 = excel.parse('Sheet1', index_col=0, parse_dates=True, @@ -187,7 +198,7 @@ def test_parse_cols_str(self): def test_excel_stop_iterator(self): - excel = self.get_data('test2', csv=False) + excel = self.get_excel('test2') parsed = excel.parse('Sheet1') expected = DataFrame([['aaaa', 'bbbbb']], columns=['Test', 'Test1']) @@ -195,7 +206,7 @@ def test_excel_stop_iterator(self): def test_excel_cell_error_na(self): - excel = self.get_data('test3', csv=False) + excel = self.get_excel('test3') parsed = excel.parse('Sheet1') expected = DataFrame([[np.nan]], columns=['Test']) @@ -203,7 +214,7 @@ def test_excel_cell_error_na(self): def test_excel_passes_na(self): - excel = self.get_data('test4', csv=False) + excel = self.get_excel('test4') parsed = excel.parse('Sheet1', keep_default_na=False, na_values=['apple']) @@ -219,7 +230,8 @@ def test_excel_passes_na(self): def test_excel_table_sheet_by_index(self): - dfref, excel = self.get_data('test1') + excel = self.get_excel('test1') + dfref = self.get_csv_refdf('test1') df1 = excel.parse(0, index_col=0, parse_dates=True) df2 = excel.parse(1, skiprows=[1], index_col=0, parse_dates=True) @@ -236,7 +248,8 @@ def test_excel_table_sheet_by_index(self): def test_excel_table(self): - dfref, excel = self.get_data('test1') + excel = self.get_excel('test1') + dfref = self.get_csv_refdf('test1') df1 = excel.parse('Sheet1', index_col=0, parse_dates=True) df2 = excel.parse('Sheet2', skiprows=[1], index_col=0, From b99be6c56179111ca5111f1b763aa4eda6d85c14 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Sat, 5 Sep 2015 12:57:58 +0200 Subject: [PATCH 4/8] helper method for read_excel, similar to ExcelFile and read_csv --- pandas/io/tests/test_excel.py | 79 ++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index 36a96962dab3e..8ece78bd8c542 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -101,7 +101,7 @@ def get_csv_refdf(self, basename): dfref = read_csv(pref, index_col=0, parse_dates=True, engine='python') return dfref - def get_excel(self, basename): + def get_excelfile(self, basename): """ Return test data ExcelFile instance. Test data path is defined by pandas.util.testing.get_data_path() @@ -119,6 +119,25 @@ def get_excel(self, basename): """ return ExcelFile(os.path.join(self.dirpath, basename + self.ext)) + def get_exceldf(self, basename, *args, **kwds): + """ + Return test data DataFrame. Test data path is defined by + pandas.util.testing.get_data_path() + + Parameters + ---------- + + basename : str + File base name, excluding file extension. + + Returns + ------- + + df : DataFrame + """ + pth = os.path.join(self.dirpath, basename + self.ext) + return read_excel(pth, *args, **kwds) + class ReadingTestsBase(SharedItems): # This is based on ExcelWriterBase @@ -279,40 +298,40 @@ def test_reader_special_dtypes(self): datetime(2015, 3, 14)]) ]) - pth = os.path.join(self.dirpath, 'test_types' + self.ext) + basename = 'test_types' # should read in correctly and infer types - actual = read_excel(pth, 'Sheet1') + actual = self.get_exceldf(basename, '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) float_expected.loc[1, "Str2Col"] = 3.0 - actual = read_excel(pth, 'Sheet1', convert_float=False) + actual = self.get_exceldf(basename, '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(pth, 'Sheet1', index_col=icol) + actual = self.get_exceldf(basename, 'Sheet1', index_col=icol) exp = expected.set_index(name) tm.assert_frame_equal(actual, exp) # convert_float and converters should be different but both accepted expected["StrCol"] = expected["StrCol"].apply(str) - actual = read_excel(pth, 'Sheet1', converters={"StrCol": str}) + actual = self.get_exceldf(basename, '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(pth, 'Sheet1', converters={"StrCol": str}, - convert_float=False) + actual = self.get_exceldf(basename, 'Sheet1', convert_float=False, + converters={"StrCol": str}) tm.assert_frame_equal(actual, no_convert_float) # GH8212 - support for converters and missing values def test_reader_converters(self): - pth = os.path.join(self.dirpath, 'test_converters' + self.ext) + basename = 'test_converters' expected = DataFrame.from_items([ ("IntCol", [1, 2, -3, -1000, 0]), @@ -328,15 +347,15 @@ def test_reader_converters(self): } # should read in correctly and set types of single cells (not array dtypes) - actual = read_excel(pth, 'Sheet1', converters=converters) + actual = self.get_exceldf(basename, 'Sheet1', converters=converters) tm.assert_frame_equal(actual, expected) def test_reading_all_sheets(self): # Test reading all sheetnames by setting sheetname to None, # Ensure a dict is returned. # See PR #9450 - pth = os.path.join(self.dirpath, 'test_multisheet' + self.ext) - dfs = read_excel(pth, sheetname=None) + basename = 'test_multisheet' + dfs = self.get_exceldf(basename, sheetname=None) expected_keys = ['Alpha', 'Beta', 'Charlie'] tm.assert_contains_all(expected_keys, dfs.keys()) @@ -346,10 +365,10 @@ def test_reading_multiple_specific_sheets(self): # references (positions/names) are removed properly. # Ensure a dict is returned # See PR #9450 - pth = os.path.join(self.dirpath, 'test_multisheet' + self.ext) + basename = 'test_multisheet' # Explicitly request duplicates. Only the set should be returned. expected_keys = [2, 'Charlie', 'Charlie'] - dfs = read_excel(pth, sheetname=expected_keys) + dfs = self.get_exceldf(basename, sheetname=expected_keys) expected_keys = list(set(expected_keys)) tm.assert_contains_all(expected_keys, dfs.keys()) assert len(expected_keys) == len(dfs.keys()) @@ -393,9 +412,7 @@ def test_read_from_http_url(self): # url = ('https://raw.github.com/pydata/pandas/master/' # 'pandas/io/tests/data/test' + self.ext) url_table = read_excel(url) - dirpath = tm.get_data_path() - localtable = os.path.join(dirpath, 'test1' + self.ext) - local_table = read_excel(localtable) + local_table = self.get_exceldf('test1') tm.assert_frame_equal(url_table, local_table) @slow @@ -404,8 +421,8 @@ def test_read_from_file_url(self): # FILE if sys.version_info[:2] < (2, 6): raise nose.SkipTest("file:// not supported with Python < 2.6") - dirpath = tm.get_data_path() - localtable = os.path.join(dirpath, 'test1' + self.ext) + + localtable = os.path.join(self.dirpath, 'test1' + self.ext) local_table = read_excel(localtable) try: @@ -486,38 +503,22 @@ def test_reader_seconds(self): time(16, 37, 1), time(18, 20, 54)])]) - epoch_1900 = os.path.join(self.dirpath, 'times_1900' + self.ext) - epoch_1904 = os.path.join(self.dirpath, 'times_1904' + self.ext) - - actual = read_excel(epoch_1900, 'Sheet1') + actual = self.get_exceldf('times_1900', 'Sheet1') tm.assert_frame_equal(actual, expected) - actual = read_excel(epoch_1904, 'Sheet1') + actual = self.get_exceldf('times_1904', 'Sheet1') tm.assert_frame_equal(actual, expected) # GH6403 def test_read_excel_blank(self): - _skip_if_no_xlrd() - - blank = os.path.join(self.dirpath, 'blank.xls') - actual = read_excel(blank, 'Sheet1') - tm.assert_frame_equal(actual, DataFrame()) - - blank = os.path.join(self.dirpath, 'blank.xlsx') - actual = read_excel(blank, 'Sheet1') + actual = self.get_exceldf('blank', 'Sheet1') tm.assert_frame_equal(actual, DataFrame()) def test_read_excel_blank_with_header(self): - _skip_if_no_xlrd() - expected = DataFrame(columns=['col_1', 'col_2']) - blank = os.path.join(self.dirpath, 'blank_with_header.xls') - actual = read_excel(blank, 'Sheet1') + actual = self.get_exceldf('blank_with_header', 'Sheet1') tm.assert_frame_equal(actual, expected) - blank = os.path.join(self.dirpath, 'blank_with_header.xlsx') - actual = read_excel(blank, 'Sheet1') - tm.assert_frame_equal(actual, expected) class XlsReaderTests(XlrdTests, tm.TestCase): ext = '.xls' From 2dd3b44f86bfaf4762ca60d552dbe8c9660a7497 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Sat, 5 Sep 2015 13:01:27 +0200 Subject: [PATCH 5/8] remove redundant "import pandas as pd" --- pandas/io/tests/test_excel.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index 8ece78bd8c542..e6c3b48866a89 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -24,7 +24,6 @@ from pandas.util.testing import ensure_clean from pandas.core.config import set_option, get_option import pandas.util.testing as tm -import pandas as pd def _skip_if_no_xlrd(): @@ -466,7 +465,7 @@ def tdf(sheetname): with ExcelWriter(pth) as ew: for sheetname, df in iteritems(dfs): df.to_excel(ew,sheetname) - dfs_returned = pd.read_excel(pth,sheetname=sheets) + dfs_returned = read_excel(pth,sheetname=sheets) for s in sheets: tm.assert_frame_equal(dfs[s],dfs_returned[s]) @@ -956,11 +955,11 @@ def test_to_excel_multiindex_no_write_index(self): # Test writing and re-reading a MI witout the index. GH 5616. # Initial non-MI frame. - frame1 = pd.DataFrame({'a': [10, 20], 'b': [30, 40], 'c': [50, 60]}) + frame1 = DataFrame({'a': [10, 20], 'b': [30, 40], 'c': [50, 60]}) # Add a MI. frame2 = frame1.copy() - multi_index = pd.MultiIndex.from_tuples([(70, 80), (90, 100)]) + multi_index = MultiIndex.from_tuples([(70, 80), (90, 100)]) frame2.index = multi_index with ensure_clean(self.ext) as path: @@ -1143,7 +1142,7 @@ def roundtrip(df, header=True, parser_hdr=0, index=True): with ensure_clean(self.ext) as path: df.to_excel(path, header=header, merge_cells=self.merge_cells, index=index) - xf = pd.ExcelFile(path) + xf = ExcelFile(path) res = xf.parse(xf.sheet_names[0], header=parser_hdr) return res @@ -1197,7 +1196,7 @@ def roundtrip2(df, header=True, parser_hdr=0, index=True): with ensure_clean(self.ext) as path: df.to_excel(path, header=header, merge_cells=self.merge_cells, index=index) - xf = pd.ExcelFile(path) + xf = ExcelFile(path) res = xf.parse(xf.sheet_names[0], header=parser_hdr) return res @@ -1272,16 +1271,16 @@ def test_bytes_io(self): df.to_excel(writer) writer.save() bio.seek(0) - reread_df = pd.read_excel(bio) + reread_df = read_excel(bio) tm.assert_frame_equal(df, reread_df) # GH8188 def test_write_lists_dict(self): _skip_if_no_xlrd() - df = pd.DataFrame({'mixed': ['a', ['b', 'c'], {'d': 'e', 'f': 2}], - 'numeric': [1, 2, 3.0], - 'str': ['apple', 'banana', 'cherry']}) + df = DataFrame({'mixed': ['a', ['b', 'c'], {'d': 'e', 'f': 2}], + 'numeric': [1, 2, 3.0], + 'str': ['apple', 'banana', 'cherry']}) expected = df.copy() expected.mixed = expected.mixed.apply(str) expected.numeric = expected.numeric.astype('int64') @@ -1468,20 +1467,20 @@ class XlwtTests(ExcelWriterBase, tm.TestCase): def test_excel_raise_error_on_multiindex_columns_and_no_index(self): _skip_if_no_xlwt() # MultiIndex as columns is not yet implemented 9794 - cols = pd.MultiIndex.from_tuples([('site', ''), + cols = MultiIndex.from_tuples([('site', ''), ('2014', 'height'), ('2014', 'weight')]) - df = pd.DataFrame(np.random.randn(10, 3), columns=cols) + df = DataFrame(np.random.randn(10, 3), columns=cols) with tm.assertRaises(NotImplementedError): with ensure_clean(self.ext) as path: df.to_excel(path, index=False) def test_excel_warns_verbosely_on_multiindex_columns_and_index_true(self): _skip_if_no_xlwt() - cols = pd.MultiIndex.from_tuples([('site', ''), + cols = MultiIndex.from_tuples([('site', ''), ('2014', 'height'), ('2014', 'weight')]) - df = pd.DataFrame(np.random.randn(10, 3), columns=cols) + df = DataFrame(np.random.randn(10, 3), columns=cols) with tm.assert_produces_warning(UserWarning): with ensure_clean(self.ext) as path: df.to_excel(path, index=True) @@ -1489,10 +1488,10 @@ def test_excel_warns_verbosely_on_multiindex_columns_and_index_true(self): def test_excel_multiindex_index(self): _skip_if_no_xlwt() # MultiIndex as index works so assert no error #9794 - cols = pd.MultiIndex.from_tuples([('site', ''), + cols = MultiIndex.from_tuples([('site', ''), ('2014', 'height'), ('2014', 'weight')]) - df = pd.DataFrame(np.random.randn(3, 10), index=cols) + df = DataFrame(np.random.randn(3, 10), index=cols) with ensure_clean(self.ext) as path: df.to_excel(path, index=False) From 97e523bcdf68d4f08e948bbaa282dc705e13de67 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Sat, 5 Sep 2015 13:03:27 +0200 Subject: [PATCH 6/8] move reading blank df to ReadingTestsBase --- pandas/io/tests/test_excel.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index e6c3b48866a89..c670aea3d6da2 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -372,6 +372,16 @@ def test_reading_multiple_specific_sheets(self): tm.assert_contains_all(expected_keys, dfs.keys()) assert len(expected_keys) == len(dfs.keys()) + # GH6403 + def test_read_excel_blank(self): + actual = self.get_exceldf('blank', 'Sheet1') + tm.assert_frame_equal(actual, DataFrame()) + + def test_read_excel_blank_with_header(self): + expected = DataFrame(columns=['col_1', 'col_2']) + actual = self.get_exceldf('blank_with_header', 'Sheet1') + tm.assert_frame_equal(actual, expected) + class XlrdTests(ReadingTestsBase): """ @@ -508,16 +518,6 @@ def test_reader_seconds(self): actual = self.get_exceldf('times_1904', 'Sheet1') tm.assert_frame_equal(actual, expected) - # GH6403 - def test_read_excel_blank(self): - actual = self.get_exceldf('blank', 'Sheet1') - tm.assert_frame_equal(actual, DataFrame()) - - def test_read_excel_blank_with_header(self): - expected = DataFrame(columns=['col_1', 'col_2']) - actual = self.get_exceldf('blank_with_header', 'Sheet1') - tm.assert_frame_equal(actual, expected) - class XlsReaderTests(XlrdTests, tm.TestCase): ext = '.xls' From d6500c3ef644a1eddfa6dacf4c4fefac3a492661 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Sat, 5 Sep 2015 13:03:56 +0200 Subject: [PATCH 7/8] remove mistakenly added test, add missing blank tests for xlsm --- pandas/io/tests/data/blank.xlsm | Bin 0 -> 8418 bytes pandas/io/tests/data/blank_with_header.xlsm | Bin 0 -> 8813 bytes pandas/io/tests/data/test_types_datetime.xls | Bin 8704 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 pandas/io/tests/data/blank.xlsm create mode 100755 pandas/io/tests/data/blank_with_header.xlsm delete mode 100644 pandas/io/tests/data/test_types_datetime.xls diff --git a/pandas/io/tests/data/blank.xlsm b/pandas/io/tests/data/blank.xlsm new file mode 100755 index 0000000000000000000000000000000000000000..c3c2074276d125fdd862bdfc423c3f40855bef1f GIT binary patch literal 8418 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 a|CN39wQ$fl`92dR0`#NBDkjtSPyYuKH&N{X literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/blank_with_header.xlsm b/pandas/io/tests/data/blank_with_header.xlsm new file mode 100755 index 0000000000000000000000000000000000000000..5b2ed0055b243b198bbc43d7ea3e7ce5391eda46 GIT binary patch literal 8813 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 From d39dc8acd722157dfefc8563796668e519e98142 Mon Sep 17 00:00:00 2001 From: davidovitch Date: Sat, 5 Sep 2015 13:15:33 +0200 Subject: [PATCH 8/8] forgotten method renames --- pandas/io/tests/test_excel.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index c670aea3d6da2..073fc55357df7 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -157,7 +157,7 @@ def setUp(self): def test_parse_cols_int(self): dfref = self.get_csv_refdf('test1') - excel = self.get_excel('test1') + excel = self.get_excelfile('test1') dfref = dfref.reindex(columns=['A', 'B', 'C']) df1 = excel.parse('Sheet1', index_col=0, parse_dates=True, parse_cols=3) @@ -169,7 +169,7 @@ def test_parse_cols_int(self): def test_parse_cols_list(self): - excel = self.get_excel('test1') + excel = self.get_excelfile('test1') dfref = self.get_csv_refdf('test1') dfref = dfref.reindex(columns=['B', 'C']) df1 = excel.parse('Sheet1', index_col=0, parse_dates=True, @@ -183,7 +183,7 @@ def test_parse_cols_list(self): def test_parse_cols_str(self): - excel = self.get_excel('test1') + excel = self.get_excelfile('test1') dfref = self.get_csv_refdf('test1') df1 = dfref.reindex(columns=['A', 'B', 'C']) @@ -216,7 +216,7 @@ def test_parse_cols_str(self): def test_excel_stop_iterator(self): - excel = self.get_excel('test2') + excel = self.get_excelfile('test2') parsed = excel.parse('Sheet1') expected = DataFrame([['aaaa', 'bbbbb']], columns=['Test', 'Test1']) @@ -224,7 +224,7 @@ def test_excel_stop_iterator(self): def test_excel_cell_error_na(self): - excel = self.get_excel('test3') + excel = self.get_excelfile('test3') parsed = excel.parse('Sheet1') expected = DataFrame([[np.nan]], columns=['Test']) @@ -232,7 +232,7 @@ def test_excel_cell_error_na(self): def test_excel_passes_na(self): - excel = self.get_excel('test4') + excel = self.get_excelfile('test4') parsed = excel.parse('Sheet1', keep_default_na=False, na_values=['apple']) @@ -248,7 +248,7 @@ def test_excel_passes_na(self): def test_excel_table_sheet_by_index(self): - excel = self.get_excel('test1') + excel = self.get_excelfile('test1') dfref = self.get_csv_refdf('test1') df1 = excel.parse(0, index_col=0, parse_dates=True) @@ -266,7 +266,7 @@ def test_excel_table_sheet_by_index(self): def test_excel_table(self): - excel = self.get_excel('test1') + excel = self.get_excelfile('test1') dfref = self.get_csv_refdf('test1') df1 = excel.parse('Sheet1', index_col=0, parse_dates=True)