From a3ac3969a4ac82860437606a5c5c7763a648fe22 Mon Sep 17 00:00:00 2001 From: Pawel Kordek Date: Sat, 30 Apr 2016 19:07:15 +0200 Subject: [PATCH] BUG: Convert non-dates in xls date cells to number closes GH10001 If there is a date column in excel in which there are cells with some big integers, that during parsing to date cause int/long overflow, issue a warning and convert the value to int or float. --- doc/source/whatsnew/v0.18.2.txt | 1 + pandas/io/excel.py | 16 ++++++++++++---- pandas/io/tests/data/testdateoverflow.xls | Bin 0 -> 19456 bytes pandas/io/tests/data/testdateoverflow.xlsm | Bin 0 -> 9374 bytes pandas/io/tests/data/testdateoverflow.xlsx | Bin 0 -> 9351 bytes pandas/io/tests/test_excel.py | 10 ++++++++++ 6 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 pandas/io/tests/data/testdateoverflow.xls create mode 100644 pandas/io/tests/data/testdateoverflow.xlsm create mode 100644 pandas/io/tests/data/testdateoverflow.xlsx diff --git a/doc/source/whatsnew/v0.18.2.txt b/doc/source/whatsnew/v0.18.2.txt index fee98720990e0..5f9ebef4fd546 100644 --- a/doc/source/whatsnew/v0.18.2.txt +++ b/doc/source/whatsnew/v0.18.2.txt @@ -74,3 +74,4 @@ Performance Improvements Bug Fixes ~~~~~~~~~ +- If there is a large numeric value in excel cell of type 'date', convert it to float instead of raising an error (:issue:`10001`) diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 642f322f17fa1..4c26480a0f583 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -329,11 +329,15 @@ def _parse_cell(cell_contents, cell_typ): appropriate object""" if cell_typ == XL_CELL_DATE: + if xlrd_0_9_3: # Use the newer xlrd datetime handling. - cell_contents = xldate.xldate_as_datetime(cell_contents, - epoch1904) - + try: + cell_contents = \ + xldate.xldate_as_datetime(cell_contents, + epoch1904) + except OverflowError: + return cell_contents # Excel doesn't distinguish between dates and time, # so we treat dates on the epoch as times only. # Also, Excel supports 1900 and 1904 epochs. @@ -346,7 +350,11 @@ def _parse_cell(cell_contents, cell_typ): cell_contents.microsecond) else: # Use the xlrd <= 0.9.2 date handling. - dt = xldate.xldate_as_tuple(cell_contents, epoch1904) + try: + dt = xldate.xldate_as_tuple(cell_contents, epoch1904) + + except xldate.XLDateTooLarge: + return cell_contents if dt[0] < MINYEAR: cell_contents = time(*dt[3:]) diff --git a/pandas/io/tests/data/testdateoverflow.xls b/pandas/io/tests/data/testdateoverflow.xls new file mode 100644 index 0000000000000000000000000000000000000000..d63942f1b5f640a3e1049e9b293e39a56034f4d7 GIT binary patch literal 19456 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 literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/testdateoverflow.xlsm b/pandas/io/tests/data/testdateoverflow.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..0207549692e6ace67c9652d175b0e3814255b3de GIT binary patch literal 9374 zcmeHNWmFvLwr$*k26s(xg1cKIP4M8>5Zv8@Lm&_|K+xbp8ixdj;1=8mf&>U|!RRR?pycwdsDr-YE@UA-BqXd{*HX5tN;g(3qS-Q0{{RjK!4c`VIm9waDxB8yFPZ{X9MvL~6LQ zpo$lo5lQQpSE{DKK9beIFx3)3=kd2Qi?hZEf1?8FP7)SCqQb`!6>Af_fwJ$93~-0FGC>;lDj70Pw{ zYiM%h`D(>&@Ygz=E&=QT99l5SI}ypuocWI_O~CYDEzWxKA`3%o?+3Uek|-lxv>b=&&ay zrsoq+I;&l&&Pt_5RAo~-S&8unc-^b!2Ldi>w-3p}_FBHI2E36s%6K^xIg@EWFf{G! zJmaPo1}{p{^ZWx(u^=(S+?e-w3;^Kv77n2N7me0vJfS&;5>F8-K{UW;7(*vB8)r7w zyESEY-#^;?KcmUWxFM(*A9U>j8zsM9ZrTBnv+^1gfelpZe7MPtH6_7oTGVB0A#_K8ZLvBgL{(R;Js5>|ynTga7JgeKaokdeHR zibO7i&MQA~f$Tll)_hHplp@749t!rmtx7&eD;%18pCZvO7le0|Hiq4MNeza}cr>f` z^!sfspCh$G_%LwsNa#z1v)I;F0Bfd2;aSsXq2+?$C6MWvaa$**x*_zj{hjLzDA)9` z(0DWs2LKQQkYPM**nX$GyS3yV#FNMNqVbaTV!frnWl`%My+op}P zeop}t5pTG9PNMe-fj)3tP57JSGrWEi=upB#sT36b`PRCj-cG^Can(FJu}rJSp5U`7 z7JtO%FeOv64sCbuqwo&Ovi7gMp}k2)l_c$^3Qy*^jeEZNPY8x3OVpQGO&SDx>fnWj zv4*}teGqjVcfFEwLi!YiZ5PbY?LHfpHg9r(_A3UJo#AJiKw04o9W61T)POSR&)kVr z6~7C3jWh>H{q8B_wzEZ6ssVrzv}M4~Oh+m-;>p%Z>KF_OsK{fJ@_9}Pk`F~T=}<69 zi?j+@y2y9uB;yR%VXN+`U7TEaRK4r)EJb)GBPsuM@tZ(HvrbJH`9c&w7VR)=Uf$_3 zM}(e%MCW|Z_&Y~cLS4sb$h>T6ZEFYi zv1 zTOu;ON6r<~EXg!G8;_X{ehgIvBzV%70+oe-Hy1x&x(`9do4DRnLT(P^rh3Ma$DGlH z{OvSDY*!(36hUEGj9kCm{d|dKUf#ugcaog=l)ozpb;)iRFzLonQBJ~+f!ngQ4g30- z=<`kJQ`SYT%%ymx#dnPBjNRp*MthBV)9A=d&e&!Mpw9lgpbrt?kE0L)00)x01oOw^ zaIrA6HDmj+X1|m3wl>I~M4GUf=72)R+aCPbjab&TXu3kzVoat&cYMV|cp=@(&77N4 zX_Le%8VGzD_>t0a#ou2Z(vf$SB8H7y=ojGr+--{UAe5F47G{ucVP^gMCfWUYnSpom z6Bn`ITp?SeW&jhO0^OC-@#Il<(IM0#^xr|HEWYMr!H$luiJ z!soT*q39PGo?K&3i!3%$65>e2uw)&|9Qa09b2FUgMDsXX7q zc9g5{XOoQ&7?xMMx+2)GNhzj_Z4Dm}8Y(3{j4UXY$$u%6H|*6iQeUZd$P36%bZjyx zn=4MbdH@KcBD8UJ^yIl9IaX>LgPFz&vxpc zcmd5S{Yz-Lrjl<>bvl9zHWLyQ_TgAB{Kq^(@j$UD=B9y?Jv*#QGJz&6NcK3}jTH)6 zdOD-ju@4Xi)df97+m#=qy(lyExxDD){C?3nmLoe9O@8h0{p?^QXOD#~dLL1VCTV|S zD)Z`QHSF65bHgUDLv3z@`m@ZI%Wnk~q7Xz0Di$uU^Ybyo3{l_n&hC~MN4c=gEc-nn zn3fW>^&pH9k*BRZD};v5960Magk8yAxO|8UcqQJ9C;lJSlQotEI@}k8VT5y0J$z4E z$6T>qz0Jmpv+oK=`fWAM_2YY&RuD`7!M;PH%*3b8fzBPUk1}1uD>b(2CT&FFYM}hk z>3p(>)h>G)BWY{`eeRb71}ePC`GWDIEmm}dB%kbI-w1(Z&3aRytN}I4OS@tCWsb5+ zB8i>z=cnYG4w`1i82tOO%2>%7^rEx_&MU4$YJ7zz{2eIHWG~Q)Kg##E=>@ZvKE{(0 zppML0NCs+4JInevDGl43Sm?en{$h62A&V+qpdn;${8|4iMy4A$%~WF=1_UO!%t(`n zFsbg=!1GDE#LLd4!r&8T|LxSs-5nuq0eN?{N6j*p@?uc&o0de&$%Vbdn5cDEqy%p* z|9&mehalVOlp^`%t_pk~oL$3d5BGiMd77B5ev+ZN=F8eW#M|>`Z&jAenmJZt=I;i= zLemG+5Bhs8s}6%Xc$A%G?BqCE6{b16e6_~Eu6+mg(Wv9M4>fjse*_vy2Ejk0P{zYF zNo#wrkI5AeTq~go=U`pRHBV&nv=)lo>dSbTdI4`d7uaEy6uonpV!(=lN=H(4B(e`Z<>RRm`t#dNHb8_jSdmW_S6%s9tVbNA z+9D%szU+wT1$RmysNTwX3N|M)2J9FTx z9A%W$lLGvz!b52;-4Np!*yBqJpDuiRjmj`hC5p(H!KuV+8X2(66LBRs#UO_*X(A)e zYxHWZIe*i$?rMPOMHXE=3d$Q28*}N)&mwD(gdtq)AP=9HGB%G+*nSaaxMY<-4#=B z%G=xD1n4>jI^;2O=sp_q`^;p4yFt|r;VlbG@GgS{w0Iv@bUu(d_nm&g6>_V9$Kp#?97R9Dv0i)`-2kV zO2O*E11~CuNj78lB<-d5SH(Glssl=zO_4BjNpkf`+ZIg;Y&k47Cu`2Xsq@ddSs5xtU9c{IkMk(UNXw?%wZ-%gDo^UAP$9{4j9BLJdf1S!U;>NseeYS87V!$c&EIfQScGDX$5@+F;FOf)!@Fa& z@X#tkRA{dW+h26dRJ=whj1gIzkqh^H(tG}jWVocr%J$F@shUlxW{>%+@3SBQVO8y$ z?bp5(LUuVVpMi%%!E*dDMk3ij{vPR_Lw^(TE%%cQYhMibeA|KkqZ5>0#qTIt+Fb(Z z-Pc3Egn#qEk9+613*wQ=ZFjZHk4C~C*SwK`e(l3it~O{xVKJjdiG(G*xFcu(G#A1{ z<+!wFE-HH2WOB4xa@K)`evX5$jRETmiaM}G*|Tpb_Qr~RW1m15P3Hp+2Dy5wJix`M zkTi|O^jo_v&!%H%ODU`X#;;Nk9u74P1STWYr3cIz4nauBE znUD?3Fpu@ubi5FC%a2yZi;}Avi9vp^;GyMT60xxz)<$(x)cMWisS6>}QxM8I@QvTc zhTcvEEOaZ^>MQwnnv~iV+!;`EX-a&|4->ENP<#?MN+bx(h0LS!YRA|j6Ib_)eNQLMCHAB(*}i?EI8}&f z2dW}5>Oih|N2hvS`Ye9Mb%t^DDj+$ebeVU?O5Z^xiRuUw0qN9aP}z=LOfqO#6^`!+ zX^!yd8`)lO0?r5m($fU=B4Hl@1VvBT{zWG#RX{T5_^PLGpBsVBL1!htK;78c1gS{C z>o^;6VahK(+9*hcIBiOVa~1t|>TO7nH$4`cn$w*k z^qeJ?TYQ`d`T`Y@aVSu~77~=)Hc%Z}BBq1v;?d{ywldTNpc;nX0)sS=yO9-|5gax=kLQ9ZH?RJ!LOUxx9W6viE$*B`snNna#Jo9t{tF<1tJBK`Rf{%$CtlugH zp`g?dTZlVe$QL7w83*jxpCrbASf-F98-GpBk;T0XIbXOfe_RMzOFU$lE|9>9E-L$e zFf<#o1Ujx8RNG+%GQ}9ib%=m4>HU!Mo3>hhIU;GiU($esiii^`BJ@AJ;Nodx_T%;w z;z6(Go?wOUh1?)fd2N@bSEE~2G=+tTW$B})N@Q(_zc!UE5sBpb+;zDn7^gSK&oV(p z6!n~Zu#uR+odD9K&Bq2|*x2MLkV?*39j&IjuKO}?!*J00z`T!GWmMe5>sgbpng?Nm zhY$)3Ja$*oclcr7UJgGYl))>=PHqiYkx#tkBXkJr*j75? z)7Q1U{;rCwaZ1fjE_NcSaSo@6V3w9I^V_waH(@IRjiOjlTVip-i`m*5rZjbo#MY&3 z$ghj`*}e|ojy|KhvUuYPUk>+GHriMx_vK|0O~m&OumwPqHHkW(_1pT9*ey&3D31#4_@*~PwQW41- z2NOmb4&q&oGB04uGP_V@a3xRoSUfVAg};eQoJO<3+PbayI;wb8yzThWfXTY=amm*B z{_vL0M}5)*M+1`yt#ye=CWiccU~);ENU*6HqCn1;0b|T_Mi+e8!YdAi)UYH3&6O}h zsmxt*?K%ssG9yv4M3>qYG*<6x&xi}EA$;oW+^TC9#a63_1?D%i#lL3DRh7*Z6I3r; zP_{h&oh=SfvACEyshPRB+^L4`-ab34iKX3kyuMP97*_W!E|`lamWI&&-4bk#vLu`Y ze#&8lnGH`C8jMx8>;X{ZVw>LwQU#Qw0DT9US6!y2zfIrXmIZ|4StVF}6n)o;pept9 zErzbqBG9w3X{;H==Yy6`lFAHUjU>l-u(FuKVKUzBg&N2l>O$tq@>MNhnPY^HJAlk=67(9!Rk9wNW>1DMPRBb2w zRH;y_v?J18vOehMUVv)lZN_R7kU&M+6^_e2P-?-J2o<6ONW@%fq;($&+))0Aksboi zKCKzU6u$sp0Yg_Jg%}5kXV~F#DSI6MEthu*(XEkpD+-k}a~pdbX*=1IaT@IO*uZGu zwdE!`C0{5pExoxTY3Et@Rx9w*T(V3ttBB4_?^*k|-E z$S+iCH`>8r8@%*6CQ@h==8`fFnnDvcY9CNC0h01qTbfCnC%LvM* zXPbh!U!V^BJNHs;WPc02(>k;hkM(En89O-qL%loF{l28d4=Qav!3sIOo3s&j)xnZ@ z0}ejJe)Y;OuXa0%(~?C`@K7-)v7jYhDvyDnqP6%fe@@QON=5y=t$7=p;cjiEvCB ziX@V0`EMdMR+)vQ8s^0)`FoG7Q3L~(B|KI9h$9vpXNT=U{T8|+KKk3%h?AS8rA<|# zXNeb`Gq~)U3BtR~9&};ZCiVQ&wocVkb#d+LgOCGAf%WtY|5MeZx#sD$tOUSF1x8meZW)jLe{Mb5uz-X`Yb zv$a9@Ld91)$A2xf_{Hiuj&G1Rf5#4?*EH3l2l83?Z2Qv}!(P)%o%Q1E%LMO5SsPa> z4LXn{9g@#1RR*UXiT6gk3`Zjz540;abJrQBmIodVAGHkcc3a<~eD~n!J9n{me9z#i z=Y9=s@&C?U7+4l)9{20_8vgaH{+{q_HRq z!26}|Pe3Z1`+z^Y3jaNd9dvTx52yTbSwA*E%IW(k_bbPr*U|v31b%_?qmI0fa=(E1 ziE@Ge1Lbe!#C?SO$@fo$yH*SII-LKVir+WApNai6WhMS$dM^+AWnOk4^snj0Pe=eD r16o4;E%~@_{?~}{XLDlmKbij#Ka>>^pn3oRFrc4GsH7$-@Am!&z9{IU literal 0 HcmV?d00001 diff --git a/pandas/io/tests/data/testdateoverflow.xlsx b/pandas/io/tests/data/testdateoverflow.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..15f0e8825339e4531b1f25ea1b6dc1c70f893dad GIT binary patch literal 9351 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

rVTG7w3MBxOI;%;wQsECj18nLUu$ z`KF*ZtO6uU13mEwzcXc z!P+*$zFL-gbiEIXAZH4@vy2Ww5u6)uK4DBA`)GVSZ)AYrVyc>3?$&t2HTd^6>hVSN zfCSv%y703E@NTFn6r$`1wRhr#KpoA#FHp2u|1?42JOqTrsK~c*5e0ogxdHZgrRJpr zrDk6AW>BFk5`B?!oJ2|GV;r`-nX8<&G7~#Z@*23>u1O>+4zSANe5Y7lE6pgYf}HX} zYQ0vPbH>H{HT`NbNr~mdxHWWKSkXqYKV`2jmQwXYqXuMBlo;2zRKl$Wej-TM$(tm3 ze;}H}q)vyo`!oe*r??i5fcz+v=6teI#sW22>Z_NEpcdwwv&wz|J{1rNv(hbz5&6bl zRBQR#hAb{wP1cvsIA85ILET-IwBOK}nIV%dvWa-yQqTRrJc=A_D=Htmf(g7S!cTL= z`t+firz9Y+xkApjAy}{pBVs|Sn<{z^-RVmtf}s1(*v~Z$4lY8rC^WR?5*%t@ z9yrVMq_A5iG@Us49-Rz#`U`HL0-wDm-@`7z^xnH$1cm$V@3c#`k@+q7yUgKD zc>F)p&e-1mAJ%>6+wWUiY`@|L7k<#m_j!$|iw?e2JS6ax;Pq>}-0ID6UQ2d8;eCbd zg#4yh>0B1l^5)`X!R+k8rSjTYTki=8DN-O^XSSXxz73nc7O_cco0!X+uTuX~KEOXCiLRIMHo3cczdmlUl(k zTgS@DnwU2Ae%PMVV?UPO|Rr)9IN%llK4@IIJ zeQHx|d{|?c`p$oU=%8t6yUY3putlo4zK=f_#EB=|IeeW+c>vJ7(bDk;m>H? z8fe@$zTI&DX{?0#%l7+ifZIKfp8z-n|Ni#>tpjo!@OIVv6A+K^HsH^O!hesV2cIka z;gmlv>&Na#C4C#^cG39rS_